状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。它将一群行为封装在状态对象中,context的行为随时可委托到那些状态对象中的一个。随着时间的流逝,当前状态在状态对象中游走改变,以反映出context内部的状态,因此context的行为也会跟着改变。但是context的客户对于状态对象了解不多,甚至是浑然不觉。
- State模式将所有与一个特定状态相关的行为都放入一个State的子类对象中,在对象状态切换时,切换相应的对象;但同时维持State的接口,这样实现了具体操作与状态转换之间的解耦。
- 为不同的状态引入不同的对象使得状态转换变得更加明确,而且可以保证不会出现状态不一致的情况,因为转换是原子性的——即要么彻底转换过来,要么不转换;
- 如果State对象没有实例变量,那么各个上下文可以共享同一个State对象,从而节省对象开销。
状态模式类图如下所示:
- Context(上下文)是一个类,它可以拥有一些内部状态。不管什么时候,只要有人调用Context的request()方法,它就会被委托到状态来处理。
- State接口定义了一个所有具体状态的共同接口,任何状态都实现这个相同的接口,这样一来,状态之间可以相互转换。
- ConcreteState(具体状态)处理来自context的请求。每一个ConcreteState都提供了它自己对于请求的实现。所以,当Context改变状态时行为也跟着改变。
以下是一个实现状态模式的例子,来源于《Head first设计模式》相应章节:GumballMachine