二十、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)来完成。将多态的部分下放到其他类中,然后主类只要转发给这个类就可以在不转变类型时达到多态的目的。
1934

被折叠的 条评论
为什么被折叠?



