设计模式的解析和实现(C++)之十七-State模式

作用:

    允许一个对象在其内部状态改变时改变它的行为。

    UML结构图:

    解析:

    State模式主要解决的是在开发中时常遇到的根据不同的状态需要进行不同的处理操作的问题,而这样的问题,大部分人是采用switch-case语句进行处理的,这样会造成一个问题:分支过多,而且如果加入一个新的状态就需要对原来的代码进行编译。State模式采用了对这些不同的状态进行封装的方式处理这类问题,当状态改变的时候进行处理然后再切换到另一种状态,也就是说把状态的切换责任交给了具体的状态类去负责。同时,State模式和Strategy模式在图示上有很多相似的地方,需要说明的是两者的思想都是一致的,只不过封装的东西不同:State模式封装的是不同的状态,而Stategy模式封装的是不同的算法。

    实现:

    1)State.h

#ifndef STATE_H
#define STATE_H

class State;

class Context
{
public:
    Context(State* pState);
    ~Context();
    void Request();
    void ChangeState(State *pState);

private:
    State *m_pState;
};

class State
{
public:
    virtual ~State(){}

    virtual void Handle(Context* pContext) = 0;
};

class ConcreateStateA
    : public State
{
public:
    void Handle(Context* pContext);
};

class ConcreateStateB
    : public State
{
public:
    void Handle(Context* pContext);
};

#endif

2)State.cpp

#include "State.h"
#include <iostream>

Context::Context(State* pState)
    : m_pState(pState)
{

}

Context::~Context()
{
    delete m_pState;
    m_pState = NULL;
}

void Context::Request()
{
    if (NULL != m_pState)
    {
        m_pState->Handle(this);
    }
}

void Context::ChangeState(State *pState)
{
    if (NULL != m_pState)
    {
        delete m_pState;
        m_pState = NULL;
    }
   
    m_pState = pState;
}

void ConcreateStateA::Handle(Context* pContext)
{
    std::cout << "Handle by ConcreateStateAn";
   
    if (NULL != pContext)
    {
        pContext->ChangeState(new ConcreateStateB());
    }
}

void ConcreateStateB::Handle(Context* pContext)
{
    std::cout << "Handle by ConcreateStateBn";

    if (NULL != pContext)
    {
        pContext->ChangeState(new ConcreateStateA());
    }
}


    3)Main.cpp

#include "State.h"

int main()
{
    State *pState = new ConcreateStateA();
    Context *pContext = new Context(pState);
    pContext->Request();
    pContext->Request();
    pContext->Request();

    delete pContext;

    return 0;
}


 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值