模式定义:
允许一个对象在其内部状态改变时改变它的行为。从而时对象看起来似乎改了其行为。
使用动机:
在软件构建过程中,某些对象的状态如果改变;其行为也会随之而发生改变,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。
enum NetworkState
{
OPEN,
CLOSE,
CONNECT
};
class NetworkProcessor
{
private:
NetworkState m_state;
public:
void Operation1()
{
if (OPEN == m_state)
{
//...
m_state = CLOSE;
}
else if (CLOSE == m_state)
{
//...
m_state = CONNECT;
}
else if (CONNECT == m_state)
{
//...
m_state = OPEN;
}
}
void Operation2()
{
if (OPEN == m_state)
{
//...
m_state = CONNECT;
}
else if (CLOSE == m_state)
{
//...
m_state = OPEN;
}
else if (CONNECT == m_state)
{
//...
m_state = CLOSE;
}
}
};
改进后:
class NetworkState
{
public:
NetworkState *m_pNextNetworkState;
virtual void Operation1() = 0;
virtual void Operation2() = 0;
virtual void Operation3() = 0;
virtual ~NetworkState() { }
};
class OpenState : public NetworkState
{
private:
static NetworkState *m_pInstance;
public:
static NetworkState *getInstance()
{
if (nullptr == m_pInstance)
{
m_pInstance = new OpenState();
}
return m_pInstance;
}
virtual void Operation1()
{
//...
m_pNextNetworkState = CloseState::getInstance();
}
virtual void Operation2()
{//...
}
virtual void Operation3()
{//...
}
};
NetworkState *OpenState::m_pInstance = nullptr;
class CloseState : public NetworkState
{
private:
static NetworkState *m_pInstance;
public:
static NetworkState *getInstance()
{
if (nullptr == m_pInstance)
{
m_pInstance = new CloseState();
}
return m_pInstance;
}
virtual void Operation1()
{
//...
m_pNextNetworkState = ConnectState::getInstance();
}
virtual void Operation2()
{//...
}
virtual void Operation3()
{//...
}
};
NetworkState *CloseState::m_pInstance = nullptr;
class ConnectState : public NetworkState
{
private:
static NetworkState *m_pInstance;
public:
static NetworkState *getInstance()
{
if (nullptr == m_pInstance)
{
m_pInstance = new ConnectState();
}
return m_pInstance;
}
virtual void Operation1()
{
//...
m_pNextNetworkState = OpenState::getInstance();
}
virtual void Operation2()
{//...
}
virtual void Operation3()
{//...
}
};
NetworkState *ConnectState::m_pInstance = nullptr;
class NetworkProcess
{
private:
NetworkState *m_pState;
public:
NetworkProcess(NetworkState *pState) : m_pState(pState) { }
void Operation1()
{
m_pState->Operation1();
m_pState = m_pState->m_pNextNetworkState;
}
void Operation2()
{
m_pState->Operation2();
m_pState = m_pState->m_pNextNetworkState;
}
void Operation3()
{
m_pState->Operation3();
m_pState = m_pState->m_pNextNetworkState;
}
};