策略模式
-
定义:
策略模式定义了一组算法,将它们逐个封装起来,并使它们可以相互替换。策略可以让算法独立于使用它们的客户而变化。策略模式主要的目的是将算法的定义和使用分开,也就是将算法的行为和环境分开,因此算法可以重用。
-
使用场景:
- 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
- 一个系统需要动态地在几种算法中选择一种。
- 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
-
UML:
- Context:持有一个策略类的引用,最终给客户端调用。
- Strategy:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
- StrategyA/B/C:实现了抽象策略定义的接口,提供具体的算法实现。
-
优点:
- 策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法。
- 避开了选择算法上的无用判断。
- 扩展性很好,可以灵活地增加新的算法。
-
缺点:
- 客户端必须知道所有的策略类,然后决定使用哪一个策略。
- 所有的策略类都会对外暴露。
- 一个系统可能会创建许多的策略类,导致客户端因为策略算法变得十分复杂。
-
样例:
public interface MethodOfTravel { public void Method(); }
public class Airplane implements MethodOfTravel { @Override public void Method() { System.out.println("选择坐飞机的方式旅游"); } }
public class Train implements MethodOfTravel { @Override public void Method() { System.out.println("选择坐火车的方式旅游"); } }
public class TravelContext { private MethodOfTravel methodOfTravel; public MethodOfTravel getMethodOfTravel() { return methodOfTravel; } public void setMethodOfTravel(MethodOfTravel methodOfTravel) { this.methodOfTravel = methodOfTravel; } public void method(){ methodOfTravel.Method(); } }
public class StrategyTest { public static void main(String[] args) { MethodOfTravel airplane = new Airplane(); MethodOfTravel train = new Train(); TravelContext context = new TravelContext(); context.setMethodOfTravel(airplane); context.method(); context.setMethodOfTravel(train); context.method(); } }