《大话设计模式 下》

《大话设计模式 下》

  • 状态模式
  • 适配器模式
  • 备忘录模式(软件中的月光宝盒)
  • 迭代器模式
  • 单例模式(饿汉模式与双重检查锁定的懒加载模式)
  • 命令模式
  • 中介者模式(中介者类来协调多个类从而降低耦合)
  • 责任链模式
  • 亨元模式(单纯享元模式和复合享元模式)
  • 解释器模式
  • 组合模式
  • 访问者模式

状态模式

??早上早起工作清醒,11点又开始困,2点后工作状态良好,晚上9点后犯困。如果想让你编写这个状态的转变,你如何设计br> 1、最低级的方式:在Work类中定义一个变量hour,并定义一个getState()方法,getState方法中根据hour值进行判断,并返回状态值。此种方式在getState()方法中有很多判断分支,可以说责任过大了,违背 了单一职责原则,当如果要改动某个时间段的状态时,需要对整个方法做出改动,维护出错风险很高,违背了“开放-封闭原则”。
2、定义一个抽象的类getResult,并且上午中午下午晚上的类都实现该类,并且在getResult中根据hour值进行切换,例如,上午的类中getResult方法判断hour如果小于11则输出困,否则将上下文类Context中的State更改为中午的类。
3、同是状态模式,可以在Work这一环境类中实现状态转换,可以在Work中创建多个State,MoningState 、NoonState 、EveningState 、AfterNoonState 和一个CurrentState,根据hour选择赋值给CurrentState。此种方式在一定程度上违背了“开闭原则”,但对其他状态类没有任何影响。
抽象的状态类:

具体的状态类,状态切换的过程在这几类中根据Work的成员hour进行判断,然后更改环境类中的状态类。

测试:

运行结果:
??????????????

《大话设计模式  下》
在状态模式结构图中包含如下几个角色:
  • Context(环境类):环境类又称为上下文类,它是拥有多种状态的对象。由于环境类的状态存在多样性且在不同状态下对象的行为有所不同,因此将状态独立出去形成单独的状态类。在环境类中维护一个抽象状态类State的实例,这个实例定义当前状态,在具体实现时,它是一个State子类的对象。
  • State(抽象状态类):它用于定义一个接口以封装与环境类的一个特定状态相关的行为,在抽象状态类中声明了各种不同状态对应的方法,而在其子类中实现类这些方法,由于不同状态下对象的行为可能不同,因此在不同子类中方法的实现可能存在不同,相同的方法可以写在抽象状态类中。
  • ConcreteState(具体状态类):它是抽象状态类的子类,每一个子类实现一个与环境类的一个状态相关的行为,每一个具体状态类对应环境的一个具体状态,不同的具体状态类其行为有所不同。
    ??在状态模式中,我们将对象在不同状态下的行为封装到不同的状态类中,为了让系统具有更好的灵活性和可扩展性,同时对各状态下的共有行为进行封装,我们需要对状态进行抽象,引入了抽象状态类角色,其典型代码如下所示:

?? 在抽象状态类的子类即具体状态类中实现了在抽象状态类中声明的业务方法,不同的具体状态类可以提供完全不同的方法实现,在实际使用时,在一个状态类中可能包含多个业务方法,如果在具体状态类中某些业务方法的实现完全相同,可以将这些方法移至抽象状态类,实现代码的复用,典型的具体状态类代码如下所示

??环境类维持一个对抽象状态类的引用,通过setState()方法可以向环境类注入不同的状态对象,再在环境类的业务方法中调用状态对象的方法,典型代码如下所示:

?? 在状态模式的使用过程中,一个对象的状态之间还可以进行相互转换,通常有两种实现状态转换的方式:
1、统一由环境类来负责状态之间的转换,此时,环境类还充当了状态管理器(State Manager)角色,在环境类的业务方法中通过对某些属性值的判断实现状态转换,还可以提供一个专门的方法用于实现属性判断和状态转换,如下代码片段所示:
??

2、 由具体状态类来负责状态之间的转换,可以在具体状态类的业务方法中判断环境类的某些属性值再根据情况为环境类设置新的状态对象,实现状态转换,同样,也可以提供一个专门的方法来负责属性值的判断和状态转换。此时,状态类与环境类之间就将存在依赖或关联关系,因为状态类需要访问环境类中的属性值,如下代码片段所示:

来源:weixin_41262453

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年2月17日
下一篇 2019年2月17日

相关推荐