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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

C++设计模式--状态模式(state)

發布時間:2025/1/21 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++设计模式--状态模式(state) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述

前面文章介紹了代理模式(在這里),代理模式和狀態模式都提供一個代理類,從結構上看,可以認為代理模式只是狀態模式的一個特例,不同之處在于,代理模式控制對其實現類的訪問,而狀態模式動態地改變其實現類,當發現大多數或者所有函數都存在條件代碼時,這種模式很有用。

狀態模式

簡單來說,狀態模式通過一個前端對象來使用后端實現對象履行其職責,在前端對象生存期期間,狀態模式從一個實現對象到另一個實現對象進行切換,以實現對于相同的函數調用產生不同的行為。

示例:

#include <iostream>using namespace std;class Creature { public:Creature():isFrog(true) {}void kiss(){isFrog = false;}void greet(){if(isFrog){cout << "Ribbet!" << endl;}else{cout << "Dearling!" << endl;}}private:bool isFrog; };int main() {Creature creature;creature.greet();creature.kiss();creature.greet();return 0; }

從上述代碼可以看到,greet()等任何其他所有函數在執行操作前都必須測試變量 isFrog,這樣讓代碼變得非常笨拙,特別是在系統中加入額外的狀態時情況會更加嚴重。

接下來我們通過狀態模式來修改以上示例,將操作委派給狀態對象:

#include <iostream>using namespace std;class Creature { private:class State{public:virtual string response() = 0;virtual ~State();};class Frog : public State{public:string response(){return "Ribbet!";}virtual ~Frog();};class Prince : public State{public:string response(){return "Daring!";}virtual ~Prince();};State * state;public:Creature():state(new Frog()){}void greet(){cout << state->response() << endl;}void kiss(){delete state;state = new Prince();} };int main() {Creature creature;creature.greet();creature.kiss();creature.greet();return 0; }

(這里為了簡單,使用了類嵌套定義,可以不必這樣做)

適用場景

在下面兩種情況下均可以使用狀態模式:

1.一個對象的行為取決于它的狀態,并且它必須在運行時刻根據狀態改變它的行為;
2.一個操作中含有龐大的多分支的條件語句,且這些分支依賴于該對象的狀態。這個狀態通常用一個或多個枚舉常量表示。通常,有多個操作包含這一相同的條件結構。State 模式將每一個條件分支放入一個獨立的類中。這使得你可以根據自身情況將對象的狀態作為一個對象,這一對象可以不依賴于其他對象而獨立變化。

總結

以上是生活随笔為你收集整理的C++设计模式--状态模式(state)的全部內容,希望文章能夠幫你解決所遇到的問題。

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