日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

设计模式C++实现(16)——状态模式

發布時間:2025/3/20 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式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)——状态模式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。