C++状态模式例子

state.h

class CContext;
class CState
{
public:
    CState(){}
    virtual ~CState(){}
    virtual void Execute(CContext* apcContext) = 0;
    virtual std::string GetState() = 0;
};

class CStateB;
class CStateA : public CState
{
public:
    CStateA(){}
    virtual ~CStateA(){}
    void Execute(CContext* apcContext);
    std::string GetState();
};

class CStateB : public CState
{
public:
    CStateB(){}
    virtual ~CStateB(){}
    void Execute(CContext* apcContext);
    std::string GetState();
};

state.cpp

#include "state.h"
#include "context.h"

void CStateA::Execute(CContext* apcContext)
{
    apcContext->ChangeState(new CStateB());
}

std::string CStateA::GetState()
{
    return "A state";
}


void CStateB::Execute(CContext* apcContext)
{
    apcContext->ChangeState(new CStateA());
}

std::string CStateB::GetState()
{
    return "B state";
}

context.h

#include <string>

class CState;
class CContext
{
public:
    CContext(CState* apoState);
    virtual ~CContext();
    void ChangeState(CState* apoState);
    void Execute();
    std::string GetState();
private:
    CState* mpoState;
};

context.cpp

#include "context.h"
#include "state.h"

CContext::CContext(CState* apoState)
{
    mpoState = apoState;
}

CContext::~CContext()
{
    if (mpoState != NULL)
    {
        delete mpoState;
        mpoState = NULL;
    }
}

void CContext::ChangeState(CState* apoState)
{
    if (mpoState != NULL)
    {
        delete mpoState;
        mpoState = NULL;
    }
    mpoState = apoState;
}

void CContext::Execute()
{
     mpoState->Execute(this);
}

std::string CContext::GetState()
{
    return mpoState->GetState();
}

stateTest.cpp

#include "state.h"
#include "context.h"

int main(int argv, char* argc[])
{
    CContext* lpoCContext = new CContext(new CStateA());
    printf("%s\n", lpoCContext->GetState().c_str());
    lpoCContext->Execute();
    printf("%s\n", lpoCContext->GetState().c_str());
    lpoCContext->Execute();
    printf("%s\n", lpoCContext->GetState().c_str());
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值