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
總結
- 上一篇: java页面请求跑批处理sql的有关问题
- 下一篇: DevExpress 中 在做全选的全消