C++设计模式--状态模式(state)
生活随笔
收集整理的這篇文章主要介紹了
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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++设计模式--单例模式(Single
- 下一篇: C++设计模式--命令模式(Comman