zoukankan      html  css  js  c++  java
  • 公用技术——设计模式20——行为型模式——状态模式

    1、概念

      状态模式是指,基于对象状态的改变,其行为也发生改变。模式本身的类结构并不是很复杂,难点在于对类的认知。

      类的认知分为三个方面,类本身,类的行为,类的关系。类的行为又可以划分为三个方面,交互(interactive),状态(state),活动(activity)。

      状态模式需要对类的状态有全面了解,以及哪些行为会触发状态的转换,以及状态对类的行为会有哪些影响。当描述简单的状态时,例如TV的开,关;电脑的开机,关机,待机等,它会很简单。当描述普通的状态时,例如线程,Ajax请求,它的难度也会上升一些,但还没有达到困难的程度。当描述复杂的状态时,例如人的表情,而且每个人从一种表情状态转换为另外一种表情状态的情况也不同,此时就很复杂,转换条件和行为是多变的,转换之后的状态是多变的,例如一个人看了一步喜剧之后,变为了哈哈大笑,也可能你早已经看过,变为了厌烦,也可能你自己状态不佳,没怎么看进去,表情没发生啥改变。

    2、UML图

      

    3、代码

      略

    4、讨论

      在参考设计模式书籍时,有些书中的示例较为简单,例如TV的开关,而且只有一个行为去触发,看似【状态】,【触发行为】,【事物本身】三种类之间存在一定的结构和关系。其实除【事物本身】与【状态】之间存在组合关系或依赖关系之外,其他结构和关系都是会改变的。

      例如上述示例中Ajax请求由Loading--->Loaded需要服务器去触发,这是一个外部条件,而Uninit状态用于描述Ajax请求未被创建,Uninit--->Loading状态需要创建对象,并且调用send方法,触发的行为也不止一个。

      在使用状态模式时,大部分需要从生命周期的角度去看待对象,生命周期的转换以及触发这些生命周期转换的条件和行为。它没有固定的类结构和关系。

    5、示例

    1. Ajax请求的状态
    2. 线程的状态
    3. P2P项目的生命周期,例如一个投资项目或债券产品的生命周期
  • 相关阅读:
    点双连通分量
    CF 839 E-最大团
    线性基
    CF 859 E
    【bzoj1303】[CQOI2009]中位数图
    【bzoj2282】[Sdoi2011]消防
    【bzoj2654]】tree
    【bzoj2600】 [Ioi2011]ricehub
    【bzoj4027】 [HEOI2015]兔子与樱花
    【bzoj3670】 [Noi2014]动物园
  • 原文地址:https://www.cnblogs.com/rain144576/p/9940854.html
Copyright © 2011-2022 走看看