将事物的每个状态的行为放入各自的类中,每个状态实现自己的动作;
当事物发生动作时,通过动作委托到状态类;
好处:
- 事物每个状态的行为局部化到它自己的类中;
- 可将事物类中各种状态剔除掉,利于维护;
- 状态对 “修改关闭”,事物类,对扩展开放;
状态模式的定义:
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改他的类;
类图
- context上下文对象:用于一些内部状态,分别用来表示上下文对象的各种状态;
- State:所有具体状态类的基类,State接口定义了所有具体状态的共同接口;
这样一来,context中的当前状态之间就可以相互替换; - ConcreteStateA: 具体状态类,处理来自Context中的请求,当context改变状态时,实际上,调用的不同状态对象中的方法,这样就实现了 context 的状态切换了;
与策略模式对比:
意图不同
- 状态模式,将一群行为封装在状态对象中,context的行为可随时委托到一群状态对象中的一个,随着程序运行,当前状态在状态对象集合中游走改变,用来反映出context内部的状态,这样context的行为也跟着变化(因为context的行为通过状态来表示了嘛),但context的客户并不需要考虑context内部是如何工作的;
- 策略模式,客户主动指定Context所要组合的策略对象是哪一个,对于context来说,通常只有一个最合适的策略对象;
一般下,我们把策略模式想象成 除了继承之外的一种弹性替代方案;
我们把状态模式想成是不用在context中放置许多条件判断的替代方案;