一、概述
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换,并且算法的变化不会影响到使用算法的客户
二、结构
策略模式把对象本身和运算规则区分开来,因此我们整个模式也分为三个部分。
环境类(Context):用来统一调控策略模式。
抽象策略类(Strategy):策略的抽象类,一般定义为接口方便扩展,抽象出策略方法
具体策略类:具体的策略实现,实现Strategy
三、例子
1、抽象策略类:
public interface TravelStrategy{
public void travelStyle();
}
2、具体策略类
高铁具体实现:
public class HighTrainStrategy implements TravelStrategy{
public void travelStyle(){
System.out.println(“乘坐高铁去旅游啦。。。。”);
}
}
火车具体实现:
public class TrainStrategy implements TravelStrategy{
public void travelStyle(){
System.out.println(“乘坐火车去旅游啦。。。。”);
}
}
飞机具体实现:
public class AirStrategy implements TravelStrategy{
public void travelStyle(){
System.out.println(“乘坐飞机去旅游啦。。。。”);
}
}
3、环境类实现
public class Traveler{
private TravelStrategy travelStrategy;
public void setTravelStrategy (TravelStrategy travelStrategy){
this.travelStrategy=travelStrategy;
}
public void travelStyle(){
travelStrategy.travelStyle();
}
public static void main(String[] args) {
Traveler traveler=new Traveler();
traveler.setTravelStrategy(new AirStrategy ());
traveler.travelStyle();
}
}
四、实际项目可运用的地方
1、收款单流水:根据业务事件类型的不同去执行不同的算法
2、策略模式+简单工厂
public interface Strategy{
public void add();
}
//业务事件=收款
public class AStrategy implements Strategy {
public void add(){
......
}
}
//业务事件=定金锁定
public class BStrategy implements Strategy {
public void add(){
......
}
}
public class Factory{
public static Strategy createStrategy(Sring busiEventType){
Strategy strateger=null;
//业务事件=收款
if(busiEventType.equals(“ECWSK0001”)){
strateger=new AStrategy();
}else if(busiEventType.equals(“BBB”)){
//业务事件=定金锁定
strateger=new BStrategy();
}
return strateger;
}
}
public class Test{
public static void main(String[] args) {
//业务事件=收款
Strategy s=Factory.createStrategy(“ECWSK0001”);
s.add();
}
}
五、策略模式的优缺点
1、优点
策略模式符合开闭原则
提高了代码的可复用性
2、缺点
客户端必须知道所有的策略,并且自行决定使用哪一个策略类。
代码中会产生非常多策略类,增加维护难度。