行为型模式--状态
作者:互联网
1、意图
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
2、结构
3、参与者
Context:定义客户感兴趣的接口;维护一个ConcreteState子类的实例,这个实例定义当前状态;
State:状态。定义一个接口以封装与Context的一个特定状态相关的行为;
ConcreteState subclasses:具体状态子类。每一子类实现一个与Context的一个状态相关的行为;
4、适用性
在以下两种情况下都可以使用状态机模式:
1)一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为;
2)一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举量表示。通常,有多个操作包含这一相同的条件结构。状态模式将每一个条件分支放入一个独立的类中。使得可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。
5、代码示例
class TCPOctetStream; class TCPState; // 定义类TCPConnection,它提供了一个传送数据的接口并处理改变状态的请求。 class TCPConnection{ { public: TCPConnection(); void Activeopen(); void PassiveOpen(); void close(); void Send(); void Acknowledge(); void Synchronize(); void Processoctet(TCPOctetStream*); private: friend class TCPState; void Changestate(TCPState*); private: TCPState* _state; }; // TCPConnection保持一个TCPState类的实例。类TCPState复制了TCPConnection的状态改变接口。 // 每一个TCPState操作都以一个TCPConnection实例作为一个参数,从而让TCPState可以访问TCPConnection中 // 的数据和改变连接的状态。 class TCPState { public: virtual void Transmit(TCPConnection*, TCPOctetstream*); virtual void ActiveOpen(TCPConnection*); virtual void Passiveopen(TCPConnection*); virtual void close(TCPConnection*); virtual void Synchronize(TCPConnection*); virtual void Acknowledge(TCPConnection*); virtual void Send(TCPConnection*); protected: void Changestate(TCPConnection*, TCPState*); };
// TCPConnection的构造器将该状态对象初始化为TCPClosed状态(在后面定义)。 TCPConnection::TCPConnection () { _state TCPClosed::Instance(); } // TCPConnection还提供了一个操作用于将这个变量设为一个新的TCPState void TCPConnection::ChangeState (TCPState* s) { _state = s; } // TCPConnection将所有与状态相关的请求委托给它的TCPState实例_state void TCPConnection::Activeopen () { _state->ActiveOpen(this); } void TCPConnection::PassiveOpen () { _state->PassiveOpen(this); } void TCPConnection::Close () { _state->Close(this); } void TCPConnection::Acknowledge () { _state->Acknowledge(this); } void TCPConnection::synchronize () { _state->Synchronize(this); }
// TCPState为所有委托给它的请求实现缺省的行为。 // 它也可以调用ChangeState操作来改变TCPConnection的状态。 // TCPState被定义为TCPConnection的友元,从而给了它访问这一操作的特权。 void TCPState::Transmit (TCPConnection*,TCPOctetstream*){} void TCPState::Activeopen (TCPConnection*){} void TCPState::PassiveOpen (TCPConnection*){} void TCPState::Close (TCPConnection*){} void TCPState::Synchronize (TCPConnection*){} void TCPState::ChangeState (TCPConnection* t, TCPState* s) { t->Changestate(s); }
// TCPState的子类实现与状态有关的行为。 // 一个TCP连接可处于多种状态:已建立、监听、已关闭等等,对每一个状态都有一个TCPState的子类。这里详细讨论三个子类: // TCPEstablished、TCPListen和TCPClosed。 class TCPEstablished : public TCPState { public: static TCPState* Instance(); virtual void Transmit(TCPConnection*, "TCPOctetstream*); virtual void close(TCPConnection*); }; class TCPListen : public TCPState { public: static TCPState* Instance(); virtual void Send(TCPConnection*); // ... }; class TCPClosed : public TCPState { public: static TCPState* Instance(); virtual void ActiveOpen(TCPConnection*); virtual void Passiveopen(TCPConnection*); // ... };
// TCPState的子类没有局部状态,因此它们可以被共享,并且每个子类只需一个实例。 // 每个TCPState子类的唯一实例由静态的Instance操作得到。 // 每一个TCPState子类为该状态下的合法请求实现与特定状态相关的行为 void TCPClosed::ActiveOpen (TCPConnection*t) { // send SYN,receive SYN,ACK,etc. Changestate(t,TCPEstablished::Instance()); } void TCPClosed::Passiveopen (TCPConnection* t) { Changestate(t,TCPListen::Instance()); } void TCPEstablished::Close (TCPConnection* t) { // send FIN,receive ACK of FIN Changestate(t,TCPListen:Instance()); } void TCPEstablished::Transmit(TCPConnection* t, TCPOctetstream* o) { t->Processoctet(o); } void TCPListen::Send (TCPConnection* t) { // send SYN,receive SYN,ACK,etc. Changestate(t,TCPEstablished::Instance()); }
// TCPState的子类没有局部状态,因此它们可以被共享,并且每个子类只需一个实例。 // 每个TCPState子类的唯一实例由静态的Instance操作得到。 // 每一个TCPState子类为该状态下的合法请求实现与特定状态相关的行为 void TCPClosed::ActiveOpen (TCPConnection*t) { // send SYN,receive SYN,ACK,etc. Changestate(t,TCPEstablished::Instance()); } void TCPClosed::Passiveopen (TCPConnection* t) { Changestate(t,TCPListen::Instance()); } void TCPEstablished::Close (TCPConnection* t) { // send FIN,receive ACK of FIN Changestate(t,TCPListen:Instance()); } void TCPEstablished::Transmit(TCPConnection* t, TCPOctetstream* o) { t->Processoctet(o); } void TCPListen::Send (TCPConnection* t) { // send SYN,receive SYN,ACK,etc. Changestate(t,TCPEstablished::Instance()); }
6、总结
状态机模式下,将一个对象根据不同状态下的行为分割为各个状态对象,每个对象只处理本状态下的行为。
状态机模式可以消除大量的if..else...或switch...case...等分支语句,这些分支依赖于该对象所处的状态。
标签:状态,Instance,--,子类,void,模式,TCPState,TCPConnection 来源: https://www.cnblogs.com/hjx168/p/16221669.html