策略模式,完成一项任务,往往有许多种不同的方式,每一种方式称为一个策略,根据环境或者条件的不同选择不同的策略来完成该项任务。策略模式是一种对象行为模式。
策略模式结构图
策略模式包含Context(环境类),Strategy(抽象策略类)和ConcreteStrategy(具体策略类)。
策略模式示例
假设我们去旅游出行,旅游出行的方式可以有乘坐飞机旅游,也可以乘坐火车旅游,如果有兴趣自行车游也是一种极具乐趣的出行方式。每一种不同的旅游出行方式都有不同的实现过程,我们可以选择一种合适的旅游方式。旅游的人相当于Context(环境类),而那些各种出行的方式就是ConcreteStrategy(具体策略类)。
Strategy(抽象的策略类),定义了抽象策略类,有一个travel()
方法:
/*抽象策略类*/
public interface TravelStrategy {
void travel();
}
ConcreteStrategy(具体策略类),下列定义了三个具体的策略类,分别是AirplaneStrategy
,TrainStrategy
和BicycleStrategy
,都实现了TravelStrategy
接口:
/*具体策略类,乘坐飞机出行*/
public class AirplaneStrategy implements TravelStrategy {
@Override
public void travel() {
System.out.println("乘坐飞机出行...");
}
}
/*具体策略类,乘坐火车出行*/
public class TrainStrategy implements TravelStrategy {
@Override
public void travel() {
System.out.println("乘坐火车出行...");
}
}
/*具体策略类,自行车游*/
public class BicycleStrategy implements TravelStrategy {
@Override
public void travel() {
System.out.println("自行车游...");
}
}
Context(环境类),是旅游的人,这里使用一个Person
类来代表,如下所示:
/*环境类,选择指定的出行的方式*/
public class Person {
TravelStrategy strategy;
/*注入策略的setter*/
public void setStrategy(TravelStrategy strategy) {
this.strategy = strategy;
}
public void travel(){
strategy.travel();
}
}
测试类实现如下:
/*测试类*/
public class Test {
public static void main(String[] args) {
//1.实例化环境类(Context)的对象
Person person = new Person();
//2.注入乘坐飞机出行的方式
TravelStrategy strategy = new AirplaneStrategy();
person.setStrategy(strategy);
person.travel();
System.out.println("==================================");
strategy = new TrainStrategy();
//2.注入乘坐火车出行的方式
person.setStrategy(strategy);
person.travel();
System.out.println("==================================");
strategy = new BicycleStrategy();
//2.注入自行车游出行的方式
person.setStrategy(strategy);
person.travel();
}
}
测试程序执行结果:
客户端的调用,只需要注入一个具体的策略对象即可,增加新的策略类也很方便,如果有新的策略则让新的策略类实现对应的抽象接口即可。策略模式不负责“为什么不能从策略模式看出哪一个具体策略适用于哪一种情况”,这一个决定。需要由客户端自行决定什么情况下使用什么策略角色。
什么场景下使用策略模式
在某些情况下,解决问题的方案和实现由很多种,往往不止一种,这个时候就可以考虑使用策略模式来实现各种方案,然后在需要切换其他方案时,可以比较容易的切换。
策略模式优缺点
优点:可以在不不修改原有系统的基础上选择行为,也可以灵活的增加新的行为。
缺点:客户端必须知道所有的策略类,并且自行决定使用哪一个策略类。