ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

行为型模式--状态

2022-05-04 17:34:17  阅读:113  来源: 互联网

标签:状态 Instance -- 子类 void 模式 TCPState TCPConnection


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有