在組件構件的過程中,某些對象的狀態經常變化,如何對這些變化進行有效的管理,同時維持高層模塊的穩定。
state,memento屬於狀態變化類別的設計模式。
motivation:在軟件構件過程中,某些對象的狀態發生變化,其行爲也相應發生變化;如何在運行時根據對象狀態來透明更改對象行爲,而不會在對象狀態和操作之間引入緊耦合。
key interface or class:
1. state接口,不同狀態下實現該接口。
feature: 狀態實例化。
structure:
template codes:
//狀態發生變化的對象
enum NetWorkStatus
{
network_open,
network_connect,
network_closed
}
class NetWorkProcess{
private:
NetWorkStatus status;
public:
void operation1(){
if(status == network_open){
//該狀態下操作,並將狀態改變
status = network_closed;
}
else if(status == network_connect){
//該狀態下操作,並將狀態改變
status = network_open;
}
else if(status == network_closed){
//該狀態下操作,並將狀態改變
status = network_connect;
}
}
void operation2(){
if(status == network_open){
//該狀態下操作,並將狀態改變
status = network_connect;
}
else if(status == network_connect){
//該狀態下操作,並將狀態改變
status = network_closed;
}
else if(status == network_closed){
//該狀態下操作,並將狀態改變
status = network_open;
}
}
void operation3(){
//...
}
}
//如果增加一個NetWorkState狀態,則operation中需要增加if分支,改動較大
//將狀態作爲基類接口
class NetWorkStatus{
public:
NetWorkState* nextState;
virtual void operation1()=0;
virtual void operation2()=0;
virtual void operation3()=0;
virtual ~ NetWorkStatus(){}
}
class OpenStatus: public NetWorkStatus
{
private:
NetWorkStatus* m_instance;
public:
static getInstance(){
//使用單例模式獲得實例
}
virtual void operation1(){
//相應操作
//設定下一狀態
nextState = CloseStatus::getInstance();
}
virtual void operation2(){
//相應操作
//設定下一狀態
nextState = CloseStatus::getInstance();
}
virtual void operation3(){
//相應操作
//設定下一狀態
nextState = CloseStatus::getInstance();
}
}
//調用
class NetWorkProcess{
private:
NetWorkStatus* pStatus;
public:
void operation1(){
//相關操作
pStatus->operation1();
pStatus = pStatus->nextState;
//相關操作
}
void operation2(){
//相關操作
pStatus->operation2();
pStatus = pStatus->nextState;
//相關操作
}
void operation3(){
//相關操作
pStatus->operation3();
pStatus = pStatus->nextState;
//相關操作
}
summary:
1. state模式將與一個狀態有關的行爲,放在status類的該狀態子類中,在狀態切換時切換子類;實現具體操作與狀態之間的解耦;
2.爲不同狀態引入不同對象,使得狀態轉換更加明確;而且保證不會出現狀態不一致的情況,因爲狀態轉換具有原子性;
3.如果state對象沒有實例變量,上下文可以共享一個state對象,從而節省對象開銷。