1、简介

1.1、意图

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

1.2、适用性

许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。

需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时 ,可以使用策略模式。

算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。

一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

1.3、优点

  • 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句,如 if…else 语句、switch…case 语句。
  • 策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。
  • 策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的实现。
  • 策略模式提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法。
  • 策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。

1.4、缺点

  • 客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类。
  • 策略模式造成很多的策略类,增加维护难度。

2、类图

img

img

3、代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public interface TravelModeStrategy {
void travel();
}
public class WalkTravelModeStrategy implements TravelModeStrategy {
@Override
public void travel() {
System.out.println("徒步出行");
}
}
public class CarTravelModeStrategy implements TravelModeStrategy {
@Override
public void travel() {
System.out.println("自驾出行");
}
}
public class TravelModeStrategyContext {
private TravelModeStrategy travelModeStrategy;

public TravelModeStrategy getTravelModeStrategy() {
return travelModeStrategy;
}

public void setTravelModeStrategy(TravelModeStrategy travelModeStrategy) {
this.travelModeStrategy = travelModeStrategy;
}

public void travel() {
travelModeStrategy.travel();
}
}
public class StrategyDemo {
public static void main(String[] args) {
TravelModeStrategyContext context = new TravelModeStrategyContext();
TravelModeStrategy travelModeStrategy = new CarTravelModeStrategy();
context.setTravelModeStrategy(travelModeStrategy);
context.travel();

travelModeStrategy = new WalkTravelModeStrategy();
context.setTravelModeStrategy(travelModeStrategy);
context.travel();
}
}

参考

https://blog.csdn.net/zsjlovesm521/article/details/94382666

http://c.biancheng.net/view/1378.html

[https://blog.csdn.net/qq_36970993/article/details/111655792