您的位置:首页 > 其它

State

2013-10-29 11:00 162 查看
//状态机 详细的在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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: