zoukankan      html  css  js  c++  java
  • 设计模式之策略模式和状态模式

         之前的一段时间一直在学习设计模式相关知识,学习一段时间后发现,设计模式不能算是知识点,其仅仅是一种思想,我们应该在日常的开发设计中潜移默化的应用这种思想,而不是为了模式而模式。言归正传,今天我想来叨叨策略模式和状态模式。

    先看看他们的UML图

     

        两个模式的UML图基本上是相同的。

        策略模式的Context含有一个Strategy的引用,将自身的功能委托给Strategy来完成。

    将上面的UML图中的Strategy接口改个名字为State,这就是状态模式了,同样Context也有一个State类型的引用,也将自己的部门功能委托给State来完成。

    他们之间真正的区别在策略模式对Strategy的具体实现类有绝对的控制权,即Context要感知Strategy具体类型。而状态模式,Context不感知State的具体实现,Context只需调用自己的方法,这个调用的方法会委托给State来完成,State会在相应的方法调用时,自动为Context设置状态,而这个过程对Context来说是透明的,不被感知的。

        设计模式五大设计原则:SOLID,S 单一职责,O 对修改关闭对扩展开放,L 里式替换,I 接口隔离,D 依赖倒置

    1.这两种模式没有明确的遵循单一职责的原则

    2.两种模式都依赖的是上层接口,符合对修改关闭对扩展开放原则

    3.显然子类的实现类都可以替换Context中接口的引用的,符合里式替换

    4.接口隔离暂未体现

    5.依赖倒置目前我是没看出来。工厂模式诠释了依赖倒置,高层调用和底层对象的产生都依赖抽象,而非具体实现,我会在稍后的系列中提到。

           再谈两种模式的使用,相对来说策略模式比状态模式简单一点。

    1. 策略模式的控制权在客户端,业务逻辑能够很好的剥离。而状态模式需要我们对整个业务中的状态进行抽象,并且需要对顶层State接口中的方法进行抽象。
    2. State的方法中需要对Context的状态进行管理,这也增加了一定的复杂性。

    PS:我更愿意将Context中Strategy引用的成员变量理解为委托,在运行时可以动态的改变Strategy的实现类,这比继承更加灵活。

  • 相关阅读:
    AcWing 3772. 更新线路(BFS)
    AcWing 3760. 最大剩余油量(树的最长路径)
    AcWing 3771. 选取石子
    洛谷P2014—选课(树形DP)
    吴恩达机器学习ex1
    洛谷P1122—最大子树和(树形DP)
    论文中关于要使用600线的python代码
    mysql 笛卡尔积
    mysql 外键
    写参考文献有感
  • 原文地址:https://www.cnblogs.com/CLFR/p/6339500.html
Copyright © 2011-2022 走看看