狀態模式:當乙個物件內在狀態改變時允許改變其行為,看起來像改變了棋類。
狀態模式,顧名思義就是表示乙個物件的狀態,並且這些狀態不一定是互斥的,常見的比如手機狀態,有開機、關機、沒有訊號、正在通話。這四種狀態中,比如手機處於關機狀態時,就不能進行通話,只能進行開機;手機沒有訊號的時候,就不能進行打**,只能進行關機;當手機出於開機狀態的時候,手機可以沒有訊號也可以關機等。
所以手機不同的狀態就會有不同狀態下的行為,而且可以在不同的狀態下進行切換。
那麼根據以上狀態可以搭建不同的手機使用場景。
首先定義手機的四種狀態:
enum phonestate;
定義手機:
class myphone ;
void myphone::setphonestate(phonestate state)
phonestate myphone::getphonestate()
void myphone::poweron()
}void myphone::poweroff()
}void myphone::calling()
}void myphone::nosignal()
}
使用場景:
int main()
執行結果:
上面實現的手機在不同的狀態下可以做的事情,使用大量的swich…case語句,如果要新增新的手機裝填呢?比如手機訊號弱等,是不是要重新每乙個函式並且新增新的case語句,這就破壞了開閉原則。
有沒有更好的辦法呢?
答案是有的,咱們可以把手機不通狀態提取出來,封裝成公共的介面。
class iphonestate ;
上面定義的函式是純虛函式,子類必須繼承實現的。
定義不通的狀態子類。
開機狀態:
//開機狀態
class statepoweron :public iphonestate ;
void statepoweron::poweroff()
void statepoweron::poweron()
void statepoweron::onsignal()
void statepoweron::calling()
關機狀態:
//關機狀態
class statepoweroff :public iphonestate ;
void statepoweroff::poweroff()
void statepoweroff::poweron()
void statepoweroff::onsignal()
void statepoweroff::calling()
沒有訊號狀態:
//沒有訊號狀態
class statenosignal :public iphonestate ;
void statenosignal::poweroff()
void statenosignal::poweron()
void statenosignal::onsignal()
void statenosignal::calling()
通話狀態:
//通話狀態
class statecalling :public iphonestate ;
void statecalling::poweroff()
void statecalling::poweron()
void statecalling::onsignal()
void statecalling::calling()
使用場景:
int main()
執行結果:
執行結果和之前使用case語句是一樣的,而且結構很清楚。
狀態模式的優點:
1.避免使用過多的switch…case語句,提高系統的可維護性;
2.很好的體現開閉原則和單一職責原則,每個狀態都是乙個子類;
C 設計模式 State 狀態模式詳解
狀態模式的適用場景 狀態模式的優缺點 狀態模式用於解決系統中複雜物件的狀態轉換以及不同狀態下行為的封裝問題。當系統中某個物件存在多個狀態,這些狀態之間可以進行轉換,而且物件在不同狀態下行為不相同時可以使用狀態模式。狀態模式將乙個物件的狀態從該物件中分離出來,封裝到專門的狀態類中,使得物件狀態可以靈活...
設計模式 狀態模式 C
狀態模式主要解決當控制乙個物件狀態的轉換的條件表達過於複雜的情況,使得狀態的轉換不依賴於整體的操作。本文將通過乙個具體的例子說明狀態模式的應用。假設下面乙個場景 乙個新任務提交後,先是收集資料,資料收集完成後等等分配一台機器,分配到機器後就可以將此任務部署至此機器後就可以通知相關模組開始工作。先對此...
設計模式 狀態模式 C
狀態模式是產生乙個可以改變其類的物件,通過前端物件狀態的變化來使後端工作的不同物件履行其職責。通過改變乙個物件的狀態,使它的工作物件也發生變化。如果乙個物件在決定它要做什麼之前總是要對當前的 狀態做很多的判斷,那麼就可以考慮使用狀態模式。乙個壞的例子 worker.h include ifndef ...