一、定义
策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以相互替换,策略模式让算法独立于使用他的客户而独立变化。
二、UML类图
三、适用场景
1、多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为
2、需要在不同的情况下使用不同的策略(算法),或者策略还可能在未来用其它方式实现。
3、对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
四、代码实现
对应的UML图的对象如下:
Stragety——TravelStrategy(策略接口)
Context——Travel(环境)
ConcreteStragety——AirPlaneStrategy、RailWayStrategy、TrainStrategy(具体策略类)
比如说我打算出去旅行,所以需要计划一下坐哪种交通工具比较好。
有飞机、火车、高铁三种交通工具供我选择。我将从这三种进行选择比较适合我出行的交通工具。
首先很明确的是这三个交通工具都可以作为出行的工具。
所以我们要定义一个旅行策略接口TrainStrategy
public interface TravelStrategy {
void travelAlgorithm();
}
public class AirPlaneStrategy implements TravelStrategy {
@Override
public void travelAlgorithm() {
System.out.println("飞机旅行策略");
}
}
public class RailWayStrategy implements TravelStrategy {
@Override
public void travelAlgorithm() {
System.out.println("高铁旅行策略");
}
}
public class TrainStrategy implements TravelStrategy {
@Override
public void travelAlgorithm() {
System.out.println("火车旅行策略");
}
}
public class Travel {
privat TravelStrategy strategy
public void setTravelStrategy(TravelStrategy strategy) {
this.strategy=strategy
}
public void selectStrategy(){
strategy.travelAlgorithm();
}
}
public class Client{
public static void main(String[] args) {
//创建策略对象
TravelStrategy strategy=new AirPlaneStrategy();
Travel travel = new Travel();
travel.setTravelStrategy(strategy);
travel.selectStrategy();
}
}
五、总结
策略模式主要用来分离算法,在相同的行为抽象下有不同的具体实现策略。这个模式很好的演示了开闭原则,也就是定义抽象,注入不同的实现,从而达到很好的可扩展性。
优点:
1、结构清晰明了、使用简单直观
2、耦合度相对而言较低,扩展方便
3、操作封装也更为彻底,数据更为安全
4、使用策略模式可以避免使用多重条件转移的语句。
缺点:
策略模式会造成很多的策略类。