设计模式学习笔记(二十二)——State状态

二十、State(状态)

情景举例:

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

代码示例:

/* TCPOctetStream类使用了State模式,它包含一个TCPState
*/
class TCPOctetStream;
class TCPState;
 
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;
};
/* TCPState类是一个行为抽象类(只有函数没有数据)
*/
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的所有行为都是直接转发给TCPState
*/
TCPConnection::TCPConnection () {
    _state = TCPClosed::Instance();
}
/*
*/
void TCPConnection::ChangeState (TCPState* s) {
    _state = s;
}
/*
*/
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);
}
/* 抽象父类的实现都是空
*/
void TCPState::Transmit (TCPConnection*, TCPOctetStream*) { }
void TCPState::ActiveOpen (TCPConnection*) { }
void TCPState::PassiveOpen (TCPConnection*) { }
void TCPState::Close (TCPConnection*) { }
void TCPState::Synchronize (TCPConnection*) { }
/*
*/ 这个函数将t的状态改变为s,申明为保护可以让子类调用,由于是友元则可以调用TCPConnection的私有函数ChangeState
void TCPState::ChangeState (TCPConnection* t, TCPState* s) {
    t->ChangeState(s);
}
/* 下面三个是TCPState的具体类
*/
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*);
    // ...
};
/* 在子类的实现中,都用到了ChangeState来让TCPConnection的行为改变
*/
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());
}
/*
*/

个人理解:

State模式与Strategy模式在《重构》中提及较多,State模式主要是在主类(例中TCPConnection类)不方便提供继承层次,而由其他类(TCPState)来完成。将多态的部分下放到其他类中,然后主类只要转发给这个类就可以在不转变类型时达到多态的目的。

 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值