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

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

詳解state狀態(tài)模式及在C++設(shè)計(jì)模式編程中的使用實(shí)例

2020-05-23 14:07:44
字體:
供稿:網(wǎng)友
這篇文章主要介紹了state狀態(tài)模式及在C++設(shè)計(jì)模式編程中的使用實(shí)例,在設(shè)計(jì)模式中策略用來處理算法變化,而狀態(tài)則是透明地處理狀態(tài)變化,需要的朋友可以參考下
 

每個(gè)人、事物在不同的狀態(tài)下會(huì)有不同表現(xiàn)(動(dòng)作),而一個(gè)狀態(tài)又會(huì)在不同的表現(xiàn)下轉(zhuǎn)移到下一個(gè)不同的狀態(tài)(State)。最簡(jiǎn)單的一個(gè)生活中的例子就是:地鐵入口處,如果你放入正確的地鐵票,門就會(huì)打開讓你通過。在出口處也是驗(yàn)票,如果正確你就可以 ok,否則就不讓你通過(如果你動(dòng)作野蠻,或許會(huì)有報(bào)警(Alarm),:))。

有限狀態(tài)自動(dòng)機(jī)(FSM)也是一個(gè)典型的狀態(tài)不同,對(duì)輸入有不同的響應(yīng)(狀態(tài)轉(zhuǎn)移)。

通常我們?cè)趯?shí)現(xiàn)這類系統(tǒng)會(huì)使用到很多的 Switch/Case 語句,Case 某種狀態(tài),發(fā)生什么動(dòng)作,Case 另外一種狀態(tài),則發(fā)生另外一種狀態(tài)。但是這種實(shí)現(xiàn)方式至少有以下兩個(gè)問題:
當(dāng)狀態(tài)數(shù)目不是很多的時(shí)候,Switch/Case 可能可以搞定。但是當(dāng)狀態(tài)數(shù)目很多的時(shí)候(實(shí)際系統(tǒng)中也正是如此),維護(hù)一大組的 Switch/Case 語句將是一件異常困難并且容易出錯(cuò)的事情。
狀態(tài)邏輯和動(dòng)作實(shí)現(xiàn)沒有分離。在很多的系統(tǒng)實(shí)現(xiàn)中,動(dòng)作的實(shí)現(xiàn)代碼直接寫在狀態(tài)的邏輯當(dāng)中。這帶來的后果就是系統(tǒng)的擴(kuò)展性和維護(hù)得不到保證。

狀態(tài)模式就是被用來解決上面列出的兩個(gè)問題的,在狀態(tài)模式中我們將狀態(tài)邏輯和動(dòng)作實(shí)現(xiàn)進(jìn)行分離。當(dāng)一個(gè)操作中要維護(hù)大量的 case 分支語句,并且這些分支依賴于對(duì)象的狀態(tài)。狀態(tài)模式將每一個(gè)分支都封裝到獨(dú)立的類中。

狀態(tài)模式典型的結(jié)構(gòu)圖為:

state狀態(tài)模式,C++設(shè)計(jì)模式編程

 

狀態(tài)模式的實(shí)現(xiàn)
代碼片斷 1:State.h

//state.h#ifndef _STATE_H_#define _STATE_H_class Context; //前置聲明class State{  public:  State();  virtual ~State();  virtual void OperationInterface(Context* ) = 0;  virtual void OperationChangeState(Context*) = 0;  protected:  bool ChangeState(Context* con,State* st);  private:  //bool ChangeState(Context* con,State* st);};class ConcreteStateA:public State{  public:  ConcreteStateA();  virtual ~ConcreteStateA();  virtual void OperationInterface(Context* );  virtual void OperationChangeState(Context*);  protected:  private:};class ConcreteStateB:public State{  public:  ConcreteStateB();  virtual ~ConcreteStateB();  virtual void OperationInterface(Context* );  virtual void OperationChangeState(Context*);  protected:  private:};#endif //~_STATE_H_

代碼片斷 2:State.cpp

//State.cpp#include "State.h"#include "Context.h"#include <iostream>using namespace std;State::State(){}State::~State(){}void State::OperationInterface(Context* con){  cout<<"State::.."<<endl;}bool State::ChangeState(Context* con,State* st){  con->ChangeState(st);  return true;}void State::OperationChangeState(Context* con){}///ConcreteStateA::ConcreteStateA(){}ConcreteStateA::~ConcreteStateA(){}void ConcreteStateA::OperationInterface(Context* con){  cout<<"ConcreteStateA::OperationInterface  ......"<<endl;}void ConcreteStateA::OperationChangeState(Context* con){  OperationInterface(con);  this->ChangeState(con,new ConcreteStateB());}///ConcreteStateB::ConcreteStateB(){}ConcreteStateB::~ConcreteStateB(){}void ConcreteStateB::OperationInterface(Context* con){  cout<<"ConcreteStateB::OperationInterface......"<<endl;}void ConcreteStateB::OperationChangeState(Context* con){  OperationInterface(con);  this->ChangeState(con,new ConcreteStateA());}

代碼片斷 3:Context.h

//context.h#ifndef _CONTEXT_H_#define _CONTEXT_H_class State;/*****/class Context{  public:  Context();  Context(State* state);  ~Context();  void OprationInterface();  void OperationChangState();  protected:  private:  friend class State; //表明在 State 類中可以訪問 Context 類的 private 字段  bool ChangeState(State* state);  private:  State* _state;};#endif //~_CONTEXT_H_

代碼片斷 4:Context.cpp

//context.cpp#include "Context.h"#include "State.h"Context::Context(){}Context::Context(State* state){  this->_state = state;}Context::~Context(){  delete _state;}void Context::OprationInterface(){  _state->OperationInterface(this);}bool Context::ChangeState(State* state){  ///_state->ChangeState(this,state);  this->_state = state;  return true;}void Context::OperationChangState(){  _state->OperationChangeState(this);}

代碼片斷 5:main.cpp

//main.cpp#include "Context.h"#include "State.h"#include <iostream>using namespace std;int main(int argc,char* argv[]){  State* st = new ConcreteStateA();  Context* con = new Context(st);  con->OperationChangState();  con->OperationChangState();  con->OperationChangState();  if (con != NULL)    delete con;  if (st != NULL)    st = NULL;  return 0;}

代碼說明:狀態(tài)模式在實(shí)現(xiàn)中,有兩個(gè)關(guān)鍵點(diǎn):
1.將狀態(tài)聲明為 Context 的友元類(friend class),其作用是讓狀態(tài)模式訪問 Context的 protected 接口 ChangeSate()。
狀態(tài)及其子類中的操作都將 Context*傳入作為參數(shù),其主要目的是狀態(tài)類可以通過這個(gè)指針調(diào)用 Context 中的方法(在本示例代碼中沒有體現(xiàn))。這也是狀態(tài)模式和 Strategy模式的最大區(qū)別所在。

2.運(yùn)行了示例代碼后可以獲得以下的結(jié)果:連續(xù) 3 次調(diào)用了 Context 的 OprationInterface()因?yàn)槊看握{(diào)用后狀態(tài)都會(huì)改變(A-B-A),因此該動(dòng)作隨著 Context 的狀態(tài)的轉(zhuǎn)變而獲得了不同的結(jié)果。


關(guān)于State模式的一些需要注意的地方
這個(gè)模式使得軟件可以在不同的state下面呈現(xiàn)出完全不同的特征

不同的theme使得相同的元素呈現(xiàn)出不同的特點(diǎn)
不同的state下面相同的操作產(chǎn)生不同的效果
不同的狀態(tài)對(duì)相同的信息產(chǎn)生不同的處理
這個(gè)模式使得操作的state邏輯更加的清楚,省去了無數(shù)的state判斷,而state的擴(kuò)展性和可維護(hù)性和執(zhí)行效率也大幅度的上升。關(guān)于state,有如下幾點(diǎn)要注意的地方:

1.所有的state應(yīng)該被一個(gè)類(State Manager Class)管理:

state之間的跳轉(zhuǎn)和轉(zhuǎn)換是非常復(fù)雜的,有時(shí)一些state可能要跳轉(zhuǎn)的目標(biāo)state有幾十個(gè),這個(gè)時(shí)候我們需要一個(gè)管理類(State Manager )來統(tǒng)一的管理這些state的切換,例如目標(biāo)state的初始化和申請(qǐng)?zhí)D(zhuǎn)state的結(jié)束處理,以及一些state間共享數(shù)據(jù)的存儲(chǔ)和處理。與其稱這個(gè)Manager 為管理類,不如說是一個(gè)中間類,它實(shí)現(xiàn)了state之間的解隅,使得各個(gè)state之間不比知道target state的具體信息,而只要向Manager申請(qǐng)?zhí)D(zhuǎn)就可以了。使得各個(gè)state的模塊化更好,更加的靈活

2.所有的state都應(yīng)該從一個(gè)state基類繼承:

既然state要教給一個(gè)manager來管理,那么自然的,這些state都應(yīng)該從一個(gè)父類繼承下來,這樣manager并不需要知道很多子類的信息,一個(gè)最單純的manager只要只要管理一個(gè)這樣的基類的指針就可以了。另外,我們還可以統(tǒng)一的把state的一些共有的屬性放在這里

3.state應(yīng)該實(shí)現(xiàn)為一個(gè)singleton:

state并不需要總是被申請(qǐng),這樣可能會(huì)造成管理上的混亂,state資源的申請(qǐng)也不應(yīng)該可以任意進(jìn)行,事實(shí)上,state的申請(qǐng)權(quán)限應(yīng)該只有 Manager才有,并且有且只有一次。在這樣的情況下,state的構(gòu)造函數(shù)似乎應(yīng)該被聲明為protected or private ,而Manager應(yīng)該被聲明為state的友元,但是友元被看成是破壞類的封裝性的一種做法,這一點(diǎn)上,我很矛盾,所以在這一條上我只能采取一種漠視的態(tài)度。

4.應(yīng)該做一個(gè)state么?這是一個(gè)問題:

state可以說是if-else的一種替代品,極端的情況下面state可以讓你的程序中if-else程序塊消失得無影無蹤,但是,這并不是銀彈。state對(duì)于狀態(tài)可預(yù)知的情況下非常有效,但是對(duì)于state不可預(yù)知,或者相似的state數(shù)量太多。過多的state會(huì)造成class的粒度過細(xì),程序反而不簡(jiǎn)潔。在這樣的情況下,你應(yīng)該考慮使用if-else程序塊來替代state。

例如:

有這樣的一個(gè)程序,它可以生成任意形狀的多邊形,而多邊形的各個(gè)節(jié)點(diǎn)是可以移動(dòng)的,問題就來了。

我并不知道用戶將要使用多少個(gè)節(jié)點(diǎn)的多邊形,因此我無法的創(chuàng)建那么多相應(yīng)的state來使得這樣一個(gè)程序正常工作。state大多數(shù)都是確定的,對(duì)于不確定的,state似乎無能為力,例如此例

一種解決方法是我利用Manager傳遞給state一個(gè)state參數(shù),讓state有機(jī)會(huì)知道用戶的操作意圖,在這個(gè)例子里面是讓state知道用戶打算操作某一個(gè)節(jié)點(diǎn),而state根據(jù)這個(gè)state參數(shù)來處理用戶的操作,比如說,state得到的是用戶操作的某一個(gè)點(diǎn)的index ,而state只要寫

points[index].moveTo(points[index].getX()+offset_x , points[index].getY()+offset_y);

就可以,從而避免了state過多出現(xiàn)的問題。



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产一区二区三区91| 中文字幕一区二区三区av| 国产999精品久久久久久| 欧美乱大交xxxxx另类| 精品日本一区二区三区| 91视频婷婷| 91在线观看污| 宅男在线观看免费高清网站| 69精品国产久热在线观看| 日日摸夜夜爽人人添av| 天堂网中文在线观看| 欧美精品一区二区高清在线观看| 国产精品久线在线观看| 亚洲精品天堂成人片av在线播放| 人妻久久久一区二区三区| 日韩电影在线观看网站| 日韩无码精品一区二区| 不卡av一区二区| 国产乱码一区| 小泽玛利亚一区二区三区视频| 欧美成人a在线| 欧美日韩激情四射| 中文字幕永久在线观看| 青青操视频在线| 国产精品极品在线观看| 最近2019中文字幕在线高清| 亚洲一区二区免费在线| 污免费在线观看| 国产在线不卡一区二区三区| 成人在线观看视频网站| 久久影院午夜片一区| 日韩免费看片| 欧美在线观看一二区| 自拍偷拍中文字幕| 国内精品视频一区二区三区| 成人午夜黄色影院| 红桃av在线播放| 精品无码久久久久久久动漫| 蜜臀av午夜一区二区三区| 亚洲人午夜精品| 国产精品v片在线观看不卡| 91精品国产全国免费观看| 69久久夜色精品国产69乱青草| 在线一区av| 精品国产乱码久久久久久闺蜜| 香蕉视频999| 污网站在线观看免费| 亚洲美女在线视频| 一区二区三区区四区播放视频在线观看| 亚洲自拍偷拍色图| 亚洲欧美日韩激情| 一区视频网站| 成人性生交大片免费看小说| 2222www色视频在线观看| 久久青草伊人| 欧美日韩中文字幕| 韩国19禁主播vip福利视频| 国产精品久久久久久久久久99| 国产精品久久久久久亚洲色| 特级西西人体www高清大胆| 久久久国产精品| 污片视频在线免费观看| 丝袜诱惑一区二区| 91精品国产91久久久久久密臀| 欧美日韩福利电影| 国产精品久久久久久一区二区三区| 一区二区三区免费观看| 日本美女视频一区| 国产精品视频第一区二区三区| 人妻91麻豆一区二区三区| 亚洲图片欧美色图| 亚洲靠逼com| 久久人人97超碰人人澡爱香蕉| 亚洲欧美日韩激情| 久久精品色图| 99热在线只有精品| 日韩在线视频播放| 色www免费视频| 一个人免费视频www在线观看| 亚洲国产美国国产综合一区二区| 日日夜夜精品视频免费观看| 黄色在线看片| 无码任你躁久久久久久老妇| 午夜激情一区二区| 四虎成人免费视频| 国产九九精品| 久久最新网址| 日本黄色小说视频| 亚洲欧美一区在线| 91网站免费| 蜜桃精品噜噜噜成人av| 95在线视频| 欧美另类中文字幕| 欧美精品三级在线观看| 天天久久综合网| 亚洲日韩中文字幕在线播放| 狠狠躁夜夜躁人人爽天天高潮| 欧美jizzhd欧美精品巨大| 欧美黄色一级片视频| 这里只有精品在线观看视频| 每日更新成人在线视频| 欧美精品一区二区三区久久| 国产婷婷一区二区三区久久| 一区二区三区四区视频| 日欧美一区二区| 国产成人精品久久亚洲高清不卡| 国产精品 日产精品 欧美精品| 国产欧美91| 日本一本在线观看| 欧美成人免费播放| 日韩亚洲精品电影| 国语对白在线刺激| 女人扒开屁股爽桶30分钟| 91国偷自产一区二区三区的观看方式| 欧美色图天堂| 男女小视频在线观看| 一区二区三区欧美亚洲| 国产吃瓜黑料一区二区| 四虎影视成人永久免费观看视频| 日本婷婷久久久久久久久一区二区| 精品国内自产拍在线观看| 少妇高清精品毛片在线视频| 丁香激情五月婷婷| 久久久久久免费毛片精品| 男女污污视频在线观看| 国产精品露脸视频| 91久久精品国产| 亚洲国产精品成人综合| 欧美性受xxxx黑人猛交| 亚洲国产欧美日韩另类综合| 麻豆视频在线播放| 国产偷拍一区二区| 国产福利一区二区精品秒拍| 电影在线观看一区| 国产精品美女午夜av| 免费a级毛片永久免费| 久久伊人蜜桃av一区二区| 国产日韩一区二区在线观看| 国产色一区二区| 欧美一区二区三区四| 污污网站在线观看| 在线免费观看av的网站| 麻豆久久久av免费| 成人禁在线观看网站| 杨幂一区二区三区免费看视频| 午夜激情在线观看视频| 亚洲三级视频网站| 美女日批视频在线观看| 国产乱淫片视频| 亚洲激情视频一区| 色偷偷久久一区二区三区| 精品久久久久久久久久久下田| 水蜜桃亚洲精品| 成人免费视频一区| 日韩美女免费视频| 中文字幕乱在线伦视频乱在线伦视频| 日韩美女视频一区| 激情中文字幕| 黄色污污视频软件| 午夜激情视频在线播放| 欧美大学生性色视频| 国产精品久久久高清免费| 日韩人妻精品无码一区二区三区| 成人做爰www看视频软件| 全球成人中文在线| 中文字幕不卡免费视频| 欧美aaaa视频| 26uuu亚洲综合色| av美女在线观看| 精品无码av在线| 全彩无遮拦全彩口工漫画全彩| 欧美一级欧美三级在线观看| 丝袜国产免费观看| 国产黄网站在线观看| 国产乱码午夜在线视频| 狠狠久久伊人中文字幕| 日韩精品手机在线| 欧美性猛片xxxx免费看久爱| 精品剧情v国产在线观看在线| 国产精品久久久久久久久借妻| 久久久久久久久蜜桃| 欧美精品中文字幕一区| 在线视频在线视频7m国产| 在线视频精品一| 午夜精品久久久久久久久久久久久蜜桃| 亚洲美女自拍偷拍| 国产少妇在线观看| 黄色av网站在线| 国产伦精品一区三区精东| 日韩三级一区二区三区| av成人手机在线| 黄色大片在线免费观看| 插我舔内射18免费视频| 欧美一区二区美女| 中文字幕日韩专区| 日韩午夜精品视频| 日日夜夜亚洲| 欧美一级夜夜爽| 91av视频免费观看| 亚洲综合免费观看高清在线观看| 亚洲国产精品悠悠久久琪琪| 新67194成人永久网站| 成人av一区二区三区在线观看| 亚洲第九十九页| 精品视频在线播放| 娇妻被老王脔到高潮失禁视频| 亚洲精品一卡二卡三卡四卡| www.这里只有精品| 色视频欧美一区二区三区| 日韩欧美视频在线| 6080亚洲理论片在线观看| 国产美女明星三级做爰| 天天综合色天天综合色h| 亚洲一区3d动漫同人无遮挡| 在线观看免费黄色网址| 国产精品第2页| 国产高清视频网站| 三级a在线观看| 国产精品一区二区三区四区在线观看| 亚洲在线资源| 欧美精品亚洲一区二区在线播放| 99在线视频观看| 99九九热只有国产精品| 天天操天天综合网| 国产伦久视频在线观看| 日韩av无码一区二区三区不卡| 在线看黄网址| 欧美日韩伦理| 日本一区二区免费在线观看视频| 亚洲国产精品久久久久久久| 欧美性猛交xxxx久久久| 国产精品四虎| 日韩欧美主播在线| 国产porn在线| 91色九色蝌蚪| 久久久久欧美精品| 激情五月激情综合| 午夜免费一区| 国产一区二区三区视频播放| 日韩中文字幕久久| fc2ppv在线观看| 色偷偷成人一区二区三区91| 日本激情视频网| 国产精品国产三级国产aⅴ无密码| 国产中文在线播放| 成视频在线观看免费观看| 久久久国产精彩视频美女艺术照福利| 国产精品久久九九| 亚洲在线视频一区二区| 国产性一乱一性一伧一色| 伊大人久久香线焦宗合一75大| 在线日本中文字幕| 精品一区二区成人免费视频| 亚洲成人免费观看| 日韩视频在线观看一区| 激情一区二区| 91caopron| 国产老女人乱淫免费| 亚洲美女久久精品| 国产精品一品二品| 亚洲综合激情在线| 精品久久久久久亚洲综合网站| 欧美性猛交xxxx乱大交蜜桃| 福利一区在线观看| 影音先锋中文资源站| 又粗又硬又爽国产视频| 国产精一区二区| 日韩免费成人av| av资源新版天堂在线| 91在线看黄| 国产丝袜护土调教在线视频| 色哟哟无码精品一区二区三区| 午夜激情影院| 久久久久亚洲精品| 中文字幕日韩第一页| av噜噜在线观看| 青青国产在线观看| 欧美一级视频免费在线观看| 香蕉国产成人午夜av影院| 国产成人综合亚洲欧美在| 日本免费黄色| 裸体一区二区| 亚洲电影免费观看高清完整版在线| 国产午夜无码视频在线观看| 尤物视频网站在线观看| 国产特黄大片aaaa毛片| 欧美aaa大片视频一二区| 中国黄色在线视频| 中文人妻熟女乱又乱精品| 麻豆精品av| 99视频免费| 亚洲一区二区久久久久久| 色女孩综合网| 九九热hot精品视频在线播放| 国产永久精品大片wwwapp| 欧洲成人在线视频| 日韩视频一区二区在线观看| 亚洲日本一区二区三区在线观看| 久草精品电影| 精品一区免费| 中文字幕精品一区二区三区在线| 日韩一级免费观看| 精品无码一区二区三区在线| 亚洲高清视频的网址| 亚洲 欧洲 日韩| freesex欧美| 国产成人免费观看网站| 国产免费一区视频观看免费| 在线播放成人| 久艹在线视频| 91高清在线视频| 国产清纯白嫩初高生在线观看91| 国产精品久久久久久久免费| 国产 日韩 欧美 综合 一区| 亚洲三级中文字幕| 青青青国产在线视频| 亚洲一卡二卡区| 国产a∨精品一区二区三区不卡| 亚洲肉体裸体xxxx137| 秋霞在线午夜| 超碰在线图片| 日韩视频在线直播| 欧美极品jizzhd欧美仙踪林| 国产精品久久久久久久裸模| 伊人成人在线视频| 日韩精品免费一区二区在线观看| 天堂资源在线观看| 黄色aa久久|