State(状态)模式
Intent
允许一个对象在内部状态改变时,行为也相应改变. 看上去就像不同的类一样.
Also Known As
Objects for States
Motivation
考虑一个类TCPConnection,表达网络的连接。一个TCPConnection对象可以处于若干不同状态之一:Established, Listening或者Closed。当一个TCPConnection对象从其他对象那里接收请求之后,他依赖于当前状态有不同的响应。例如,根据连接是在Closed状态还是Established状态,同样的Open请求的效果会不同。状态模式描述了TCPConnection可以怎样在不同的状态下展现不同的行为。
这种模式的关键思想是引入了一个TCPState的抽象类来表达网络连接的状态。TCPState类为所有表达操作状态的类宣告了一个共同的接口。TCPState的子类实现了不同状态的行为。
Applicability
在下列情形中可以使用State模式:
情形1。 一个对象的行为依赖于其状态,而且必须在运行时根据状态的不同改变行为
情形2。 操作有大量,多方的条件性语句,依赖于对象的状态。这个状态通常由一个或多个枚举常量表达。通常,若干操作将包含同样的条件结构。状态模式把条件的不同分支装到不同的类里。这样你就可以把对象的状态本身当作一个对象来对待,拥有它自己的权利和义务,从而可以与其它的对象区别开来。
Structure
Participants
1. Context (TCPConnection)
-定义Client感兴趣的接口
-维护定义当前状态的ConcreteState子类的实例
2. State (TCPState)
-定义一个封装Context特定状态关联行为的接口
3. ConcreteState subclasses (TCPEstablished, TCPListen, TCPClosed)
-每一个子类都实现了一种跟Context状态关联的行为
Collaborations
1. Context把特定于状态的请求委托给当前的ConcreteState对象
2. 一个context可以把自己作为参数传递给处理请求的State对象。这样State对象在必要时就可以访问conext了
3. Context是Client的主要接口。Client可以为State对象配置context。一旦一个context对象被配置了,它的clients不会直接跟State对象打交道。
4. Context或者ConcreteState子类都不能决定哪个状态之后是哪个状态,以及那种情况下有哪个状态。
Consequences
State
本文地址:http://com.8s8s.com/it/it33595.htm