美文网首页达叔的朋友圈们
大话设计模式读书笔记-2策略模式

大话设计模式读书笔记-2策略模式

作者: QuietHeart | 来源:发表于2020-03-03 10:31 被阅读0次

    第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),无需知道是什么类、什么方法。

    相关文章

      网友评论

        本文标题:大话设计模式读书笔记-2策略模式

        本文链接:https://www.haomeiwen.com/subject/xpnxkhtx.html