C++设计模式--状态模式(state)
概述
前面文章介紹了代理模式(在這里),代理模式和狀態(tài)模式都提供一個(gè)代理類,從結(jié)構(gòu)上看,可以認(rèn)為代理模式只是狀態(tài)模式的一個(gè)特例,不同之處在于,代理模式控制對(duì)其實(shí)現(xiàn)類的訪問,而狀態(tài)模式動(dòng)態(tài)地改變其實(shí)現(xiàn)類,當(dāng)發(fā)現(xiàn)大多數(shù)或者所有函數(shù)都存在條件代碼時(shí),這種模式很有用。
狀態(tài)模式
簡(jiǎn)單來說,狀態(tài)模式通過一個(gè)前端對(duì)象來使用后端實(shí)現(xiàn)對(duì)象履行其職責(zé),在前端對(duì)象生存期期間,狀態(tài)模式從一個(gè)實(shí)現(xiàn)對(duì)象到另一個(gè)實(shí)現(xiàn)對(duì)象進(jìn)行切換,以實(shí)現(xiàn)對(duì)于相同的函數(shù)調(diào)用產(chǎn)生不同的行為。
示例:
#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()等任何其他所有函數(shù)在執(zhí)行操作前都必須測(cè)試變量 isFrog,這樣讓代碼變得非常笨拙,特別是在系統(tǒng)中加入額外的狀態(tài)時(shí)情況會(huì)更加嚴(yán)重。
接下來我們通過狀態(tài)模式來修改以上示例,將操作委派給狀態(tài)對(duì)象:
#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; }(這里為了簡(jiǎn)單,使用了類嵌套定義,可以不必這樣做)
適用場(chǎng)景
在下面兩種情況下均可以使用狀態(tài)模式:
1.一個(gè)對(duì)象的行為取決于它的狀態(tài),并且它必須在運(yùn)行時(shí)刻根據(jù)狀態(tài)改變它的行為;
2.一個(gè)操作中含有龐大的多分支的條件語句,且這些分支依賴于該對(duì)象的狀態(tài)。這個(gè)狀態(tài)通常用一個(gè)或多個(gè)枚舉常量表示。通常,有多個(gè)操作包含這一相同的條件結(jié)構(gòu)。State 模式將每一個(gè)條件分支放入一個(gè)獨(dú)立的類中。這使得你可以根據(jù)自身情況將對(duì)象的狀態(tài)作為一個(gè)對(duì)象,這一對(duì)象可以不依賴于其他對(duì)象而獨(dú)立變化。
總結(jié)
以上是生活随笔為你收集整理的C++设计模式--状态模式(state)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++设计模式--单例模式(Single
- 下一篇: C++设计模式--命令模式(Comman