状态模式-State
名称:
状态模式(State Pattern)-对象行为模式
问题:
The State pattern allows an object to alter its behavior when its internal state changes. The object appears to change its class.
允许一个对象在其内部状态改变时改变她的行为。对象看起来似乎修改了它的类。
适用性:
-一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
-一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其它对象而独立变化。
协作:
-Context将于状态相关的请求委托给当前的ConcreteState对象处理。
-Context可将自身作为一个参数传递给处理该请求的状态对象。这使得状态对象在必要时可访问Context。
-Context是客户使用的主要接口。客户可用状态对象来配置一个Context,一旦一个Context配置完毕,它的客户不再需要直接与状态对象打交道。
-Context或ConcreteState子类都可决定哪个状态是另外哪一个的后继者,以及是在何种条件下进行状态转换。
优点和缺点:
1、它将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
2、它使得状态转换显式化。
3、State对象可被共享。
解决方案:
1、 模式的参与者
1、Context
-定义客户感兴趣的接口。
2、State
-定义一个接口以封装与Context的一个特定状态相关的行为。
3、ConcreteState subclasses
-每一个子类实现一个与Context的一个状态相关的行为。
2.实现方式
class Context { private State state; public Context() { this.state=new ConcreteStateA(); } public void setState(State state) { this.state=state; } public State getState() { return state; } public void Handle() { state.Handle(this); } }
abstract class State { public abstract void Handle(Context context); }
class ConcreteStateA extends State { public void Handle(Context context) { context.setState(new ConcreteStateB()); } }
class ConcreteStateB extends State { public void Handle(Context context) { context.setState(new ConcreteStateA()); } }
参考资料
《设计模式:可复用面向对象软件的基础》