亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

解析C++編程中如何使用設計模式中的狀態模式結構

2020-05-23 14:06:30
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了如何在C++編程中適用設計模式中的狀態模式結構,狀態模式強調將特定狀態相關的邏輯分散到一些類的狀態類中,需要的朋友可以參考下
 

作用:當一個對象的內在狀態改變時允許改變其行為,這個對象看起來像是改變了其類。

UML圖如下:

C++編程,狀態模式結構

State類,抽象狀態類,定義一個接口以封裝與Context的一個特定狀態相關的行為。
ConcreteState類,具體狀態,每一個子類實現一個與Context的一個狀態相關的行為。
Context類,維護一個ConcreteState子類的實例,這個實例定義當前的狀態。

狀態模式主要解決的是當控制一個對象狀態轉換的條件表達式過于復雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把復雜的判斷邏輯簡化。

狀態模式的好處是將與特定狀態相關的行為局部化,并且將不同狀態的行為分割開來。

將特定的狀態相關的行為都放入一個對象中,由于所有與狀態相關的代碼都存在于某個ConcreteState中,所以通過定義新的子類可以很容易地增加新的狀態和轉換。

可以消除龐大的條件分支語句。狀態模式通過把各種狀態轉移邏輯分布到State的子類之間,來減少相互間的依賴。

當一個對象的行為取決于它的狀態,并且它必須在運行時刻根據狀態改變它的行為時,就可以考慮使用狀態模式。
另外如果業務需求某項業務有多個狀態,通常都是一些枚舉常量,狀態的變化都是依靠大量的多分支判斷語句來實現,此時應該考慮將每一種業務狀態定義為一個State的子類。這樣這些對象就可以不依賴于其他對象兒獨立變化了。

實例代碼如下:

State.h#ifndef _STATE_H_

#define _STATE_H_class Context;class State{public:  virtual void Handle(Context* pContext)=0;  ~State();protected:  State();private:};class ConcreteStateA : public State{public:  ConcreteStateA();  ~ConcreteStateA();  virtual void Handle(Context* pContext);protected:private:};class ConcreteStateB : public State{public:  ConcreteStateB();  ~ConcreteStateB();  virtual void Handle(Context* pContext);protected:private:};class ConcreteStateC : public State{public:  ConcreteStateC();  ~ConcreteStateC();  virtual void Handle(Context* pContext);protected:private:};class Context{public:  Context(State* pState);  ~Context();  void Request();  void ChangeState(State* pState);protected:private:  State* _state;};#endif


State.cpp

#include "State.h"#include <iostream>using namespace std;State::State(){}State::~State(){}ConcreteStateA::ConcreteStateA(){}ConcreteStateA::~ConcreteStateA(){}//執行該狀態的行為并改變狀態void ConcreteStateA::Handle(Context* pContext){  cout << "ConcreteStateA" << endl;  pContext->ChangeState(new ConcreteStateB());}ConcreteStateB::ConcreteStateB(){}ConcreteStateB::~ConcreteStateB(){}//執行該狀態的行為并改變狀態void ConcreteStateB::Handle(Context* pContext){  cout << "ConcreteStateB" << endl;  pContext->ChangeState(new ConcreteStateC());}ConcreteStateC::ConcreteStateC(){}ConcreteStateC::~ConcreteStateC(){}//執行該狀態的行為并改變狀態void ConcreteStateC::Handle(Context* pContext){  cout << "ConcreteStateC" << endl;  pContext->ChangeState(new ConcreteStateA());}//定義_state的初始狀態Context::Context(State* pState){  this->_state = pState;}Context::~Context(){}//對請求做處理,并設置下一狀態void Context::Request(){  if(NULL != this->_state)  {    this->_state->Handle(this);  }}//改變狀態void Context::ChangeState(State* pState){  this->_state = pState;}

main.cpp
#include "State.h"

int main(){  State* pState = new ConcreteStateA();  Context* pContext = new Context(pState);  pContext->Request();  pContext->Request();  pContext->Request();  pContext->Request();  pContext->Request();  return 0;}

總結

對于狀態模式,很多情況下和策略模式看起來極為相似。實際上它們都是為了解決具體子類實現抽象接口的實現異構問題而存在的(封裝變化),但是它們的側重各不相同。而針對算法的異構問題,模板方法模式通過繼承的方式來改變一部分算法實現(原子操作在不同具體子類中可以有不同實現),策略模式則通過組合的方式來改變整個算法(可動態替換),而狀態模式則強調的是針對不同的狀態對象可以有不同的響應。因此狀態模式實際上強調的狀態的概念,并且強調對狀態轉換的邏輯封裝,即對象可能處于不同的狀態下,而各個狀態在響應了該狀態的實現后可能會動態轉到另一個狀態,而這個轉變我們不希望 Context 的參與(Context 不必維護這個轉換)。狀態機在編譯原理的 DFA/NDFA 中很常見,針對一個輸入字符和已有串,DFA/NDFA 可能會轉換到另外一個狀態。

因此對于狀態模式有以下幾個關鍵點:

1. 狀態模式會處理算法的不同,但是更加關注的是狀態的改變。并且對于狀態的轉變邏輯一般會放在 State 子類中實現。而對于不同狀態的處理則可以放在 Context 類中,State 子類保存一個指向 Context 的引用(實際上往往傳遞一個指向 Context 的指針即可,而不必在 State 子類真正保存一個引用),以調用這些實現。當然放在 State 子類中實現也無可厚非,不過為了突出重點,使用前一種方式實現更能說明問題。當然在實際開發中,完全可以不受這個制約。

2.在具體實現過程中,對狀態的改變我們會在 Context 類中實現(因為Context 才有 State 的概念),而在 State 子類中的狀態轉變邏輯實現則通過調用這個實現來達到目的。當然為了不讓這個改變狀態的接口暴露給普通客戶程序員,我們將 Context 中這個接口聲明為 private,而在將State 類聲明為 Context 的 friend 類,并且將 State 子類中狀態改變邏輯實現聲明為 Protected,不讓普通客戶程序員調用。具體請參考示例代碼部分。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人自拍视频在线观看| 日韩精品在线免费播放| 中文字幕亚洲天堂| 视频直播国产精品| 日韩激情视频在线| 668精品在线视频| 中文字幕免费国产精品| 亚洲精品国产福利| 色妞一区二区三区| 国产精品久久久久久久久久99| 日韩一级裸体免费视频| 国产精品免费久久久久影院| 国产精品免费小视频| 亚洲a级在线观看| 国产精品天天狠天天看| 蜜臀久久99精品久久久久久宅男| 8x海外华人永久免费日韩内陆视频| 成人激情免费在线| 超碰97人人做人人爱少妇| 96sao精品视频在线观看| 性欧美视频videos6一9| 日韩黄色av网站| 亚洲精品有码在线| 精品无人国产偷自产在线| 日韩免费在线视频| 日韩成人在线电影网| 日韩欧美国产免费播放| 亚洲国产成人在线视频| 国产精品第二页| 中文字幕亚洲一区在线观看| 日韩欧美有码在线| 久久精品国产亚洲7777| 国产精品久久久久久久久久久久久久| 欧美成人sm免费视频| 亚洲a中文字幕| 九色91av视频| 亚洲天堂开心观看| 亚洲女人初尝黑人巨大| 日韩三级成人av网| 97久久久免费福利网址| 91免费看片网站| 国产欧美一区二区三区久久| 精品国产福利在线| 亚洲国产精品久久| 久久免费视频网| 久久久久九九九九| 91理论片午午论夜理片久久| 蜜臀久久99精品久久久无需会员| 成人在线一区二区| 亚洲精品aⅴ中文字幕乱码| 亚洲欧美日韩精品久久奇米色影视| 国产精品久久久久久av下载红粉| 欧美视频在线观看 亚洲欧| 日韩精品福利在线| 欧美成aaa人片在线观看蜜臀| 日韩亚洲欧美中文在线| 深夜福利日韩在线看| 亚洲国语精品自产拍在线观看| 日本免费一区二区三区视频观看| 性色av一区二区三区在线观看| 亚洲精品日韩丝袜精品| 国产精品第七影院| 亚洲аv电影天堂网| 高清欧美性猛交xxxx| 精品久久久91| 精品国产乱码久久久久久虫虫漫画| 欧美亚洲视频在线观看| 97精品在线视频| 欧美一级片一区| 91免费看片在线| 性视频1819p久久| 欧美激情综合亚洲一二区| 久久高清视频免费| 国产精自产拍久久久久久蜜| 国产精品高潮呻吟视频| 欧美大成色www永久网站婷| 精品国产一区二区三区久久狼5月| 欧美极品少妇xxxxⅹ喷水| 日韩欧美在线免费观看| 日本不卡免费高清视频| 成人在线视频网站| 国产精品高潮呻吟久久av野狼| 成人看片人aa| 欧美午夜片欧美片在线观看| 日韩av资源在线播放| 国产精品白嫩初高中害羞小美女| 亚洲视频在线观看免费| 午夜精品国产精品大乳美女| 97香蕉超级碰碰久久免费软件| 日韩欧美在线网址| 另类视频在线观看| 久久久久久国产免费| 日韩最新中文字幕电影免费看| 亚洲一区亚洲二区| 亚洲国产天堂网精品网站| 国产精品十八以下禁看| 亚洲午夜未删减在线观看| 日韩va亚洲va欧洲va国产| 亚洲精品中文字幕av| 国产在线播放91| 91亚洲精华国产精华| 亚洲人成电影网站色| 亚洲人成网站色ww在线| 久久99精品久久久久久琪琪| 欧美成人三级视频网站| 国内精品久久久久久久久| 韩国三级日本三级少妇99| 中文字幕国产亚洲2019| 成人性生交大片免费看视频直播| 久久久女人电视剧免费播放下载| 日韩精品一二三四区| 久久久亚洲国产天美传媒修理工| 久久91精品国产| 久久久免费精品| 欧美噜噜久久久xxx| 疯狂做受xxxx欧美肥白少妇| 亚洲精品免费网站| 国产精品最新在线观看| 国产一区二区黑人欧美xxxx| 色av吧综合网| 亚洲午夜久久久久久久| 亚洲精品视频网上网址在线观看| 欧美极品少妇全裸体| 欧美激情亚洲另类| 日本高清视频一区| 欧美日韩另类在线| 亚洲人在线观看| 成人黄色av网| 欧洲亚洲在线视频| 亚洲白虎美女被爆操| 91成品人片a无限观看| 国产不卡av在线| 亚洲娇小xxxx欧美娇小| 国产免费一区二区三区在线能观看| 7m第一福利500精品视频| 亚洲综合中文字幕68页| 国产精品久久久久久av福利| 欧美性一区二区三区| 日本国产高清不卡| 久99久在线视频| 欧美在线国产精品| 亚洲福利影片在线| 久久久精品日本| 中文字幕在线成人| 亚洲国产欧美一区二区丝袜黑人| 欧美激情2020午夜免费观看| 69久久夜色精品国产69乱青草| 2018日韩中文字幕| 91精品国产乱码久久久久久久久| 国模视频一区二区三区| 精品国产一区二区三区在线观看| 日韩视频―中文字幕| 成人h片在线播放免费网站| 成人激情免费在线| 国内外成人免费激情在线视频| 亚洲理论片在线观看| 一区国产精品视频| 欧美在线视频播放| 日韩在线国产精品| 亚洲a∨日韩av高清在线观看| 亚洲一二三在线| 色哟哟网站入口亚洲精品| 国产精品美女网站| 久热精品视频在线观看一区|