其他分享
首页 > 其他分享> > 行为型模式--状态

行为型模式--状态

作者:互联网

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