104 lines
2.4 KiB
Plaintext
104 lines
2.4 KiB
Plaintext
看下策略模式的定义
|
|
策略模式定义了一些列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变换。
|
|
|
|
首先,需要定义一个策略接口。
|
|
|
|
public interface Strategy {
|
|
void travel();
|
|
}
|
|
然后根据不同的出行方式实行对应的接口
|
|
|
|
public class WalkStrategy implements Strategy{
|
|
|
|
@Override
|
|
public void travel() {
|
|
System.out.println("walk");
|
|
}
|
|
|
|
}
|
|
|
|
public class PlaneStrategy implements Strategy{
|
|
|
|
@Override
|
|
public void travel() {
|
|
System.out.println("plane");
|
|
}
|
|
|
|
}
|
|
|
|
public class SubwayStrategy implements Strategy{
|
|
|
|
@Override
|
|
public void travel() {
|
|
System.out.println("subway");
|
|
}
|
|
}
|
|
此外还需要一个包装策略的类,并调用策略接口中的方法
|
|
|
|
public class TravelContext {
|
|
Strategy strategy;
|
|
|
|
public Strategy getStrategy() {
|
|
return strategy;
|
|
}
|
|
|
|
public void setStrategy(Strategy strategy) {
|
|
this.strategy = strategy;
|
|
}
|
|
|
|
public void travel() {
|
|
if (strategy != null) {
|
|
strategy.travel();
|
|
}
|
|
}
|
|
}
|
|
|
|
测试一下代码
|
|
|
|
public class Main {
|
|
public static void main(String[] args) {
|
|
TravelContext travelContext=new TravelContext();
|
|
travelContext.setStrategy(new PlaneStrategy());
|
|
travelContext.travel();
|
|
travelContext.setStrategy(new WalkStrategy());
|
|
travelContext.travel();
|
|
travelContext.setStrategy(new SubwayStrategy());
|
|
travelContext.travel();
|
|
}
|
|
}
|
|
|
|
输出结果如下
|
|
plane
|
|
walk
|
|
subway
|
|
|
|
|
|
5 策略模式的优点与缺点
|
|
策略模式主要用来分离算法,根据相同的行为抽象来做不同的具体策略实现。很好的实现了开闭原则,也就是定义抽象,注入具体实现,从而达到很好的可扩展性。
|
|
|
|
优点
|
|
|
|
使用了组合,使架构更加灵活
|
|
|
|
富有弹性,可以较好的应对变化(开闭原则)
|
|
|
|
更好的代码复用性(相对于继承)
|
|
|
|
消除大量的条件语句
|
|
|
|
缺点
|
|
|
|
随着策略的增加,子类也会变得繁多。
|
|
|
|
选择何种算法需要客户端来创建对象,增加了耦合,这里可以通过与工厂模式结合解决该问题;
|
|
|
|
策略模式设计原则:
|
|
|
|
找出应用中需要变化的部分,把它们独立出来,不要和那些不需要变化的代码混在一起
|
|
面向接口编程,而不是面向实现编程
|
|
多用组合,少用继承
|
|
6 总结
|
|
策略模式在开发应用场景很多,平时有意识的运用好策略模式,可以很好的提高的程序的可维护性和可扩展性。
|
|
|
|
|
|
策略模式和工厂模式搭配使用 |