//状态机 详细的在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;
}