初试“自动机”设计
加入一个状态,问题出现
- 设计不是面向对象的。
- 状态转换不清晰,多条条件分支语句
- 没有封装变化
- 没遵循开闭原则
- 进一步的增加状态会导致bug
新设计
将状态封装到各自类中,当动作发生时委托给当前状态。
Intent动机
允许对象在内部状态改变时,改变他的行为,对象看起来好像修改了它的类。
跟策略模式对比
1、意图不同:策略模式是定义一个算法家族,将他们封装起来,使得他们之间可以相互替换。 状态模式是将一个个状态封装成一个个类,当内部状态发生改变时,改变他们的行为。
2、策略模式和状态模式的类图几乎一样
3、策略模式中,客户端知道具体的策略有哪些,客户端能够通过setStrategy方法来动态地设置具体使用哪个策略,而状态模式中,客户端不知道内部是怎么变化的,状态模式通过状态的转换来组合state对象,最后把行为呈现出来。
Review
- 和状态机不同,状态模式用类来代表状态。
- context会将行为委托给当前对象
- 状态转换可以有state控制也可以由context控制。
- (缺点)会导致设计中类的数目大大增加。
- 策略模式通常用行为或算法装配context类
- 状态模式允许context随着状态的改变而转换行为。