第2章 商场促销——策略模式
概念
策略模式定义算法家族,分别封装后,让它们可相互替换,此模式可以让使用算法的用户不会因算法的变化而受到影响。
实现
- 策略抽象类(Strategy): 定义所有算法公共抽象接口(AlgorithmInterface())
- 具体策略(ConcreteStrategyXX): 继承策略抽象类,实现具体接口(AlgorithmInterface())
- 上下文类(Context): 用其直观的子类ConcreteContext来配置,维护对Stratety的引用,其中有直观的接口(ContextInterface)让客户端调用。
- 客户端类: 创建具体算法对象,算法对象传入上下文类,通过上下文类操作算法对象。
这里,Strategy相当于前面简单工厂模式中的Operate类,但是Context类不是简单工厂类,而是另外一个客户端调用的类,客户端不直接调用算法的接口,而是通过Context定义的直观的方式来调用算法。
实现图示:
使用方式:
作用
参照简单工厂模式进行总结一下。
- 简单工厂模式封装了对象的创建,但并没有封装对象类的概念。客户端还需知道有父类和子类这个东西(尽管不用知道具体子类),这样对客户的专业性要求耦合度更高了。
- 策略模式,也是将不同算法用不同子类实现,算法公共接口在父类中。不同的是,另外创建一个Context类,这个Context类负责通过一个直观的Context方法名间接调用对应算法对象中的公共的方法。
与简单工厂模式的区别是,它封装了对象类的概念,客户端不用知道算法的父亲类以及算法的具体方法了,通过一个直观易理解的Context和对应的Context方法名就行。
另外,策略模式还是需要创建子算法对象的分支放到客户端调用过程中的,那样可以与工厂模式结合,将Factory类也放到Context类中,这样客户端也像工厂模式一样,不用选择类对象,子类对象的创建在Context的分支内部中就已经实现了。即,这时的Context同时完成了工厂模式的对象创建,以及封装了对象类的概念。
采用了策略模式+简单工厂模式后,代码类似,但含义层次已然不同:
(1)工厂模式中,还需要知道具体算法的大致接口、以及算法父类。
(2)而结合了策略模式,只需要知道一个直观的Context类,以及易理解的接口(如GetResult),无需知道是什么类、什么方法。
网友评论