1、概念
状态模式是指,基于对象状态的改变,其行为也发生改变。模式本身的类结构并不是很复杂,难点在于对类的认知。
类的认知分为三个方面,类本身,类的行为,类的关系。类的行为又可以划分为三个方面,交互(interactive),状态(state),活动(activity)。
状态模式需要对类的状态有全面了解,以及哪些行为会触发状态的转换,以及状态对类的行为会有哪些影响。当描述简单的状态时,例如TV的开,关;电脑的开机,关机,待机等,它会很简单。当描述普通的状态时,例如线程,Ajax请求,它的难度也会上升一些,但还没有达到困难的程度。当描述复杂的状态时,例如人的表情,而且每个人从一种表情状态转换为另外一种表情状态的情况也不同,此时就很复杂,转换条件和行为是多变的,转换之后的状态是多变的,例如一个人看了一步喜剧之后,变为了哈哈大笑,也可能你早已经看过,变为了厌烦,也可能你自己状态不佳,没怎么看进去,表情没发生啥改变。
2、UML图
3、代码
略
4、讨论
在参考设计模式书籍时,有些书中的示例较为简单,例如TV的开关,而且只有一个行为去触发,看似【状态】,【触发行为】,【事物本身】三种类之间存在一定的结构和关系。其实除【事物本身】与【状态】之间存在组合关系或依赖关系之外,其他结构和关系都是会改变的。
例如上述示例中Ajax请求由Loading--->Loaded需要服务器去触发,这是一个外部条件,而Uninit状态用于描述Ajax请求未被创建,Uninit--->Loading状态需要创建对象,并且调用send方法,触发的行为也不止一个。
在使用状态模式时,大部分需要从生命周期的角度去看待对象,生命周期的转换以及触发这些生命周期转换的条件和行为。它没有固定的类结构和关系。
5、示例
- Ajax请求的状态
- 线程的状态
- P2P项目的生命周期,例如一个投资项目或债券产品的生命周期