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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值