• 大战设计模式【1】—— 策略模式


    策略模式(strategy)

    策略模式使用的例子

    https://github.com/LinkinStars/DesignPatternsAllExample

    strategy—|

           |—oopnonuse面向对象角度不使用策略模式的例子

           |—pop—|

                                   |—nonuse面向过程角度不使用策略模式的例子

                                   |use使用策略模式的例子

     

    一、定义

    定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化。

     

    二、结构

    Context(环境类):负责使用算法策略,其中维持了一个抽象策略类的引用实例。
    Strategy(策略类的接口):所有策略类的父类(接口),为所支持的策略算法声明了抽象方法。
    ConcreteStrategy(具体策略类):实现了在抽象策略类中声明的方法。

     

    三、优点

    提供了对开闭原则的完美支持,用户可以在不修改原有系统的基础上选择具体算法或行为,也可以灵活地增加新的算法或行为。
    避免了多重的if-else条件选择语句,利于系统的维护。
    提供了一种算法的复用机制,不同的环境类可以方便地复用这些策略类。

     

    四、缺点

    客户端需要知道所有的策略类,并自行决定使用哪一个策略(使用者必须知道每一个策略类其中的算法)
    将造成系统产生很多的具体策略类,任何细小的变化都将导致系统要增加一个具体策略类(策略越多,类越多)
    无法在客户端同时使用多个策略类(一次只能使用一种策略)

     

    五、应用场景

    如果一个系统要动态地在几种算法之间选择其中一种
    如果有难以维护的多重if-else条件选择语句是为了实现对象的行为
    不希望客户知道复杂的与算法有关的数据结构,可以将其封装到策略中

     

    六、个人总结

    1.从面向过程的角度来说
    很多时候,我们需要判断各种条件后然后执行不同的业务逻辑
    而且执行的业务逻辑非常的复杂,我们可以看作一个个复杂的算法(策略)
    我们可以将其进行拆分为一个个策略类来实现,从而方便维护,方便复用
    2.从面向对象的角度来说
    如果使用继承
    如果父类不是抽象方法,那么容易导致忘记或者遗漏重写方法,
    如果使用抽象方法,那么每个类都必须去重写父类的方法,无论你需不需要(有的时候你是不需要的)
    而且有可能大多数的代码相同时,改动就变得很复杂了
    如果使用多个接口实现
    那么如果使用策略A就需要修改为接口A,如果使用策略B就需要修改为接口B
    比较麻烦,而且接口多,代码复用性就变差了
    策略模式使用组合(在类中增加一个私有域,引用另一个已有类的实例,通过调用引用实例的方法从而获得新的功能)
    足够的灵活,更加易于维护,策略可以复用

    参考博客:http://www.cnblogs.com/edisonchou/p/7295164.html

  • 相关阅读:
    iOS企业证书开发的APP证书过期时间监控
    事件冒泡,事件捕获
    倒计时
    获取多个div,点击第几个,显示第几个
    js继承
    javascript基础知识总结
    大型web系统高效应用方法(转载)
    数据库(内联,外联,交叉联)
    .net零碎基础知识点不完全小结
    C#的内存管理:堆、栈、托管堆与指针(转)
  • 原文地址:https://www.cnblogs.com/linkstar/p/7601700.html
Copyright © 2020-2023  润新知