策略模式使用场景:
当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能
以去北京旅游为例,可以选择飞机、火车、汽车等几种交通工具;
1.抽象策略类
package com.company.src.StrategyTest;
public interface GotoBeiJingStrategy {
public void gotoStrategy();
}
2.具体策略类飞机
package com.company.src.StrategyTest;
public class AirplayStrategy implements GotoBeiJingStrategy {
@Override
public void gotoStrategy() {
System.out.println("乘坐飞机去北京");
}
}
- 具体策略类火车
package com.company.src.StrategyTest;
public class TrainStrategy implements GotoBeiJingStrategy {
@Override
public void gotoStrategy() {
System.out.println("乘坐火车去北京");
}
}
- 具体策略类汽车
package com.company.src.StrategyTest;
public class BusStrategy implements GotoBeiJingStrategy {
@Override
public void gotoStrategy() {
System.out.println("乘坐汽车去北京");
}
}
- 上下文环境类
package com.company.src.StrategyTest;
public class Context {
private GotoBeiJingStrategy strategy;
public Context(GotoBeiJingStrategy strategy) {
this.strategy = strategy;
}
//上下文接口
public void gotoBeiJing(){
strategy.gotoStrategy();
}
}
代码演示:
//strategy
Context context = new Context(new AirplayStrategy());
context.gotoBeiJing();
Context context1 = new Context(new TrainStrategy());
context1.gotoBeiJing();
Context context2 = new Context(new BusStrategy());
context2.gotoBeiJing();
执行结果:
策略模式的主要优点如下。
1.多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句,如 if…else 语句、switch…case 语句。
2.策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。
3.策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的。
4.策略模式提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法。
5.策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。
主要缺点如下。
1.客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类。
2.策略模式造成很多的策略类,增加维护难度。