生活随笔
收集整理的這篇文章主要介紹了
设计模式C++实现(16)——状态模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??狀態模式:允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。它有兩種使用情況:(1)一個對象的行為取決于它的狀態, 并且它必須在運行時刻根據狀態改變它的行為。(2)一個操作中含有龐大的多分支的條件語句,且這些分支依賴于該對象的狀態。本文的例子為第一種情況,以戰爭為例,假設一場戰爭需經歷四個階段:前期、中期、后期、結束。當戰爭處于不同的階段,戰爭的行為是不一樣的,也就說戰爭的行為取決于所處的階段,而且隨著時間的推進是動態變化的。下面給出相應的UML圖。
? ? ? ?實現的代碼比較簡單,給出War類和State類,War類中含State對象(指針形式)。
[cpp]?view plaincopy print?
class?War;?? class?State??? {?? public:?? ????virtual?void?Prophase()?{}?? ????virtual?void?Metaphase()?{}?? ????virtual?void?Anaphase()?{}?? ????virtual?void?End()?{}?? ????virtual?void?CurrentState(War?*war)?{}?? };?? ?? class?War?? {?? private:?? ????State?*m_state;???? ????int?m_days;???????? public:?? ????War(State?*state):?m_state(state),?m_days(0)?{}?? ????~War()?{?delete?m_state;?}?? ????int?GetDays()?{?return?m_days;?}?? ????void?SetDays(int?days)?{?m_days?=?days;?}?? ????void?SetState(State?*state)?{?delete?m_state;?m_state?=?state;?}?? ????void?GetState()?{?m_state->CurrentState(this);?}?? };??
? ? ? ? ? ?給出具體的狀態類:
[cpp]?view plaincopy print?
?? class?EndState:?public?State?? {?? public:?? ????void?End(War?*war)??? ????{?? ????????cout<<"戰爭結束"<<endl;?? ????}?? ????void?CurrentState(War?*war)?{?End(war);?}?? };?? ?? class?AnaphaseState:?public?State?? {?? public:?? ????void?Anaphase(War?*war)??? ????{?? ????????if(war->GetDays()?<?30)?? ????????????cout<<"第"<<war->GetDays()<<"天:戰爭后期,雙方拼死一搏"<<endl;?? ????????else?? ????????{?? ????????????war->SetState(new?EndState());?? ????????????war->GetState();?? ????????}?? ????}?? ????void?CurrentState(War?*war)?{?Anaphase(war);?}?? };?? ?? class?MetaphaseState:?public?State?? {?? public:?? ????void?Metaphase(War?*war)??? ????{?? ????????if(war->GetDays()?<?20)?? ????????????cout<<"第"<<war->GetDays()<<"天:戰爭中期,進入相持階段,雙發各有損耗"<<endl;?? ????????else?? ????????{?? ????????????war->SetState(new?AnaphaseState());?? ????????????war->GetState();?? ????????}?? ????}?? ????void?CurrentState(War?*war)?{?Metaphase(war);?}?? };?? ?? class?ProphaseState:?public?State?? {?? public:?? ????void?Prophase(War?*war)???? ????{?? ????????if(war->GetDays()?<?10)?? ????????????cout<<"第"<<war->GetDays()<<"天:戰爭初期,雙方你來我往,互相試探對方"<<endl;?? ????????else?? ????????{?? ????????????war->SetState(new?MetaphaseState());?? ????????????war->GetState();?? ????????}?? ????}?? ????void?CurrentState(War?*war)?{?Prophase(war);?}?? };??
? ? ? ? ?使用方式:
[cpp]?view plaincopy print?
?? int?main()?? {?? ????War?*war?=?new?War(new?ProphaseState());?? ????for(int?i?=?1;?i?<?40;i?+=?5)?? ????{?? ????????war->SetDays(i);?? ????????war->GetState();?? ????}?? ????delete?war;?? ????return?0;?? }??
? ??
總結
以上是生活随笔為你收集整理的设计模式C++实现(16)——状态模式的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。