13、状态模式
关键是区分事物内部的状态,事物内部状态的改变往往会带来事物的行为改变
案例:电灯开关
状态模式的关键是
- 把事物的每种状态都封装成单独的类,跟此种状态有关的行为都被封装在这个类的内部
- 把状态的切换规则事先分布在状态类中,这样就有效地消除了原本存在的大量条件分支语句
优点:
- 状态与行为之间的关系,并将它们封装在一个类里。通过增加新的状态类,很容易增加新的状态和转换;
- 避免Context无限膨胀
- 对象代替字符串来记录当前状态
- Context中的请求动作和状态类中封装的行为可以非常容易地独立变化而互不影响。
缺点:
- 定义许多状态类
- 造成了逻辑分散的问题,我们无法在一个地方就看出整个状态机的逻辑
对比策略模式:
相同: 它们都有一个上下文、一些策略或者状态类,上下文把请求委托给这些类来执行
不同:意图上有很大不同 策略模式各个策略类之间是平等又平行的,它们之间没有任何联系, 所以客户必须熟知这些策略类的作用,以便客户可以随时主动切换算法;
状态模式中,状态和状态对应的行为是早已被封装好的,状态之间的切换也早被规定完成, “改变行为”这件事情发生在状态模式内部。对客户来说,并不需要了解这些细节。
状态机 javascript 状态机
- call 请求委托给某个字面量对象来执行
- 利用下面的delegate函数来完成这个状态机编写(闭包)
表驱动有限状态机 https://github.com/jakesgordon/javascript-state-machine
状态机在游戏开发中也有着广泛的用途,特别是游戏AI的逻辑编写