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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

State

發布時間:2024/4/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 State 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

//狀態機? 詳細的在23種設計模式 4.2

//1) 使用環境(Context)角色:客戶程序是通過它來滿足自己的需求。它定義了客戶程序需要的接口;并且維護一個具體狀態角色的實例,這個實例來決定當前的狀態。
//2) 狀態(State)角色:定義一個接口以封裝與使用環境角色的一個特定狀態相關的行為。
//3) 具體狀態(Concrete State)角色:實現狀態角色定義的接口。

//GOF《設計模式》中給狀態模式下的定義為:允許一個對象在其內部狀態改變時改變它的行為

#include <stdio.h>
class Context; //前置聲明

class State
{
public:
?State();
?virtual ~State();
?virtual void OperationInterface(Context* ) = 0;//interface 接口
?virtual void OperationChangeState(Context*) = 0;
protected:
?bool ChangeState(Context* con,State* st)
?{
??con->ChangeState(st);
??return true;?
?}
private:
?//bool ChangeState(Context* con,State* st);
};

class ConcreteStateA:public State? //狀態A
{
public:
?ConcreteStateA();
?virtual ~ConcreteStateA();

?//State及其子類中的操作都將Context*傳入作為參數,其主要目的是State類可以通過這個指針調用Context中的方法(在本示例代碼中沒有體現)
?virtual void OperationInterface(Context* con){} //在這里寫應對狀態變化的相關行為

?virtual void OperationChangeState(Context* con)//在一個狀態即將結束的時候啟用下一個狀態
?{
??OperationInterface(con);
??this->ChangeState(con,new ConcreteStateB()); //狀態A改變成B 這個函數就是把 StateB 放入con
?}
};

class ConcreteStateB:public State //狀態B
{
public:
?ConcreteStateB();

?virtual ~ConcreteStateB();

?virtual void OperationInterface(Context* con){}

?virtual void OperationChangeState(Context*con)
?{
??OperationInterface(con);
??this->ChangeState(con,new ConcreteStateA());
?}
};

class Context
{
public:
?Context();
?Context(State* state)
?{
??this->_state = state;
?}
?~Context()
?{
??delete _state;
?}

?void OperationInterface()
?{
??_state->OperationInterface(this);
?}

?void OperationChangState()
?{
??_state->OperationChangeState(this);
?}
protected:
private:
?friend class State; // State可以訪問Context內一切包括私有 單向的?
?bool ChangeState(State* state)
?{///_state->ChangeState(this,state);
??this->_state = state;
??return true;
?}
private:
?State* _state;
};

void State_test()
{
?State* st = new ConcreteStateA();
?Context* con = new Context(st);//使用環境

?//連續3次調用了Context的OprationInterface()因為每次調用后狀態都會改變(A-B-A),因此該動作隨著Context的狀態的轉變而獲得了不同的結果。
?con->OperationChangState();
?con->OperationChangState();
?con->OperationChangState();

?if (con != NULL)
??delete con;
?if (st != NULL)
??st = NULL;
}

轉載于:https://www.cnblogs.com/sssssnian/p/3748591.html

總結

以上是生活随笔為你收集整理的State的全部內容,希望文章能夠幫你解決所遇到的問題。

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