定义
策略模式是一个在可以在运行时选择算法行为的设计模式。
策略模式:
-
定义了一个算法族
-
封装每个算法
-
族内的算法可以相互替换
此模式让算法的变化独立于使用算法的客户。使用策略模式时,我们可以通过输入数据、数据的类型或者其他可以识别的因素来选择不同的算法,这些因素我们直到运行时才能获取到。
比如不同的薪资有不同的个人所得税算法,购物时花费不同的价格有不同的优惠策略,交税在不同国家有不同的计算方法等等。我们可以定义一系列对应的策略算法,之后通过个人薪资、花费的价格、所在的地区,选择对应的策略进行计算。
使用
定义一个策略接口和几个实现此接口的类,客户端持有一个策略接口,在运行时根据输入数据等信息选择对应的具题策略赋值给接口,之后执行策略接口的方法(即对应的具体实现类中实现的方法)。
对于不熟悉上面UML的可以阅读深入浅出UML类图和看懂UML类图和时序图了解一下。
代码(Java)
// 策略接口 public interface Strategy { void execute(); } // 具体策略类A public class ConcreteStrategyA implements Strategy { @Override public void execute() { System.out.println("This is ConcreteStrategyA"); } } // 具体策略类B public class ConcreteStrategyB implements Strategy { @Override public void execute() { System.out.println("This is ConcreteStrategyB"); } } // 用户类 public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public Strategy getStrategy() { return strategy; } public void setStrategy(Strategy strategy) { this.strategy = strategy; } // 用户方法,执行具体赋值的策略的计算方法 public void execute() { System.out.println("context execute"); strategy.execute(); } public static void main(String[] args) { Context context = new Context(new ConcreteStrategyA()); context.execute(); // 可以根据输入的数据等信息进行判断,设置对应的具体策略来执行 context.setStrategy(new ConcreteStrategyB()); context.execute(); } }
总结
策略模式主要是找出应用中可能需要变化之处,把它们独立出来进行封装,不和那些不需要变化的代码混在一起。
这样可以独立出最小的部分来进行复用,避免了有很多的将易变和不变部分混合在一起的实现类,导致出现重复代码的情况。
同时策略模式符合开-闭原则,对扩展开发,对修改关闭,当有新的策略出现的时候,只要添加一个对应的继承策略接口的具体类即可,不需修改其他策略。