首页 > 代码库 > State - 状态模式
State - 状态模式
定义?
允许一个对象在其内部状态改变时改变它的行为。
案例
比如一个表示网络连接的类TCPConnection,它有不同的状态:连接已建立(Established),正在监听(Listening),连接已关闭(Closed)。当这个TCPConnection收到其他对象请求时,根据自身不同状态做出不同的响应。使用State模式处理这类问题的时候,引入一个TCPState类,它提供了所有正对TCPConnection不同状态操作的一个公共接口。
TCPConnection提供了一个传送数据的接口并处理改变状态的请求:
Class TCPConnection
{
public:
TCPConnection();
void activeOPen();
void passiveOpen();
void close();
void send();
protected:
friend class TCPState;
void changeState(TCPState* state);
private:
TCPState* m_state;
};
TCPConnection::TCPConnection()
{
m_state = TCPClosed::instance();
}
void TCPConnection::activeOpen()
{
m_state->activeOpen();
}
void TCPConnection::passiveOpen()
{
m_state->passiveOpen();
}
void TCPConnection::close()
{
m_state->close();
}
void TCPConnection::send()
{
m_state->send();
}
void changeState(TCPState* state)
{
m_state = state;
}
每一个TCPState操作都以一个TCPConnection实例作为参数,从而可以访问TCPConnection的数据和改变状态:
class TCPState
{
public:
virutal void activeOPen(TCPConnection*);
virtual void passiveOpen(TCPConnection*)
virtual void close(TCPConnection*);
virtual void send(TCPConnection*);
protected:
void changeState(TCPConnection*, TCPState*);
};
class TCPEStablished : public TCPState
{
public:
static TCPState* instance();
virtual void close(TCPConnection* t)
{
changeState(t, TCPConnection::instance());
}
};
class TCPListen : public TCPState
{
public:
static TCPListen* instance();
vritual void send(TCPConnection* t)
{
// send SYN, receive SYN, ACK, ect.
changeState(t, TCPEStabiished::instance());
}
};
class TCPClosed : public TCPState
{
public:
virtual void activeOpen(TCPConnection* t)
{
// send SYN, receive SYN, ACK, ect.
changeState(t, TCPEStablished::instance());
}
virtual void passiveOpen(TCPConnection* t)
{
// send FIN, receive ACK of FIN.
changeState(t, TCPListen::instance());
}
};
适用性
- 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
- 一个操作中含有庞大的多分支的条件语句,并且这些分支依赖与该对象的状态。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。