介绍
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
类图说明
旅行的出游方式,选择骑自行车、坐动车又或者是飞机,每一种旅行方式都是一个策略。没错,今天的例子不是车的例子。从类图解析来看,我们定义了一个策略的接口对象,定义一个出行方式的方法。然后分别定义自行车、动车、以及飞机的对象,每个对象分别实现出行方式的方法。然后定义一个Context对象,可以通过构造函数实例化Strategy对象,然后定义一个doChoice方法,该方法调用每一种策略的具体实现。也就是如果选择了自行车对象,那么将调用自行车的出行方式出行。
代码示例
文件结构如下:
代码示例如下:
public interface Strategy {
void travelMode();
}
public class Bicycle implements Strategy {
@Override
public void travelMode() {
System.out.println("自行车方式出行");
}
}
public class MotorCar implements Strategy {
@Override
public void travelMode() {
System.out.println("动车方式出行");
}
}
public class Airplane implements Strategy {
@Override
public void travelMode() {
System.out.println("飞机方式出行");
}
}
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void doChoice(){
this.strategy.travelMode();
}
}
public class StrategyPattern {
public static void main(String[] args) {
System.out.println("小明今天出游,想选择的方式是:");
Context context = new Context(new Airplane());
context.doChoice();
System.out.println("小红今天出游,想选择的方式是:");
context = new Context(new Bicycle());
context.doChoice();
}
}
运行结果如下:
应用场景
- 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为
- 一个系统需要动态地在几种算法中选择一种
- 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现
优缺点
优点
- 算法可以自由切换
- 避免使用多重条件判断
- 扩展性良好
缺点
- 策略类会增多
- 所有策略类都需要对外暴露
注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题