状态模式(State)

意图
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

应用场景
uu

类图

参与者
  • Context
    定义客户感兴趣的接口
    维护一个ConcreteState子类的实例,这个实例定义当前状态
  • State(状态)
    定义一个接口以封装与Context的一个特定状态相关的行为
  • ConcreteState
    每一个具体类实现一个与Context的一个状态相关的行为

代码
//有错误,c++不能在同一个文件中定义相互引用的类
#include <iostream>
using namespace std;
//抽象状态类,定义一个接口,
//用来封装与Context的特定状态相关的行为
class State
{
public:
    virtual void Handle(Context *pContext) = 0;
};
class ConcreteStateA:public State
{
public:
    void Handle(Context *pContext)
    {
        //设置ConcreteStateA的下一个状态是ConcreteStateB
        pContext->SetState(new ConcreteStateB());
    }
};
class ConcreteStateB:public State
{
public:
    void Handle(Context *pContext)
    {
        //设置ConcreteStateB的下一个状态是ConcreteStateA
        pContext->SetState(new ConcreteStateA());
    }
};
//Context类:维护一个ConcreteState子类的实例,
//这个实例定义当前的状态
class Context
{
private:
    State *pState;
public:
    Context(State *pState)
    {
        this->pState = pState;
    }
    void SetState(State *pState)
    {
        this->pState = pState;
    }
    void Request()
    {
        pState->Handle(this);
    }
};
int main()
{
    Context *pContext = new Context(new ConcreteStateA());
    //不断请求,更换状态
    pContext->Request();
    pContext->Request();
    pContext->Request();
    pContext->Request();
}




posted @ 2013-11-21 16:35  tanhaiyuan  阅读(182)  评论(0编辑  收藏  举报