State模式C++实现

作用:
允许一个 对象在其内部状态改变时改变它的行为.

UML结构图:


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

实现:
1)State.h
ExpandedBlockStart.gif ContractedBlock.gif /**/ /********************************************************************
    created:    2006/08/05
    filename:     State.h
    author:        李创
                
http://www.cppblog.com/converse/

    purpose:    State模式的演示代码
********************************************************************
*/


#ifndef STATE_H
#define  STATE_H

class  State;

class  Context
ExpandedBlockStart.gifContractedBlock.gif
{
public:
    Context(State
* pState);
    
~Context();
    
void Request();
    
void ChangeState(State *pState);

private:
    State 
*m_pState;
}
;

class  State
ExpandedBlockStart.gifContractedBlock.gif
{
public:
ExpandedSubBlockStart.gifContractedSubBlock.gif    
virtual ~State(){}

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

class  ConcreateStateA
    : 
public  State
ExpandedBlockStart.gifContractedBlock.gif
{
public:
    
void Handle(Context* pContext);
}
;

class  ConcreateStateB
    : 
public  State
ExpandedBlockStart.gifContractedBlock.gif
{
public:
    
void Handle(Context* pContext);
}
;

#endif

2)State.cpp
ExpandedBlockStart.gif ContractedBlock.gif /**/ /********************************************************************
    created:    2006/08/05
    filename:     State.cpp
    author:        李创
                
http://www.cppblog.com/converse/

    purpose:    State模式的演示代码
********************************************************************
*/


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

Context::Context(State
*  pState)
    : m_pState(pState)
ExpandedBlockStart.gifContractedBlock.gif
{

}


Context::
~ Context()
ExpandedBlockStart.gifContractedBlock.gif
{
    delete m_pState;
    m_pState 
= NULL;
}


void  Context::Request()
ExpandedBlockStart.gifContractedBlock.gif
{
    
if (NULL != m_pState)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        m_pState
->Handle(this);
    }

}


void  Context::ChangeState(State  * pState)
ExpandedBlockStart.gifContractedBlock.gif
{
    
if (NULL != m_pState)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        delete m_pState;
        m_pState 
= NULL;
    }

    
    m_pState 
= pState;
}


void  ConcreateStateA::Handle(Context *  pContext)
ExpandedBlockStart.gifContractedBlock.gif
{
    std::cout 
<< "Handle by ConcreateStateA\n";
    
    
if (NULL != pContext)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        pContext
->ChangeState(new ConcreateStateB());
    }

}


void  ConcreateStateB::Handle(Context *  pContext)
ExpandedBlockStart.gifContractedBlock.gif
{
    std::cout 
<< "Handle by ConcreateStateB\n";

    
if (NULL != pContext)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        pContext
->ChangeState(new ConcreateStateA());
    }

}


3)Main.cpp
ExpandedBlockStart.gif ContractedBlock.gif /**/ /********************************************************************
    created:    2006/08/05
    filename:     Main.cpp
    author:        李创
                
http://www.cppblog.com/converse/

    purpose:    State模式的测试代码
********************************************************************
*/


#include 
" State.h "

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

    delete pContext;

    
return 0;
}

转载于:https://www.cnblogs.com/weiqubo/archive/2011/01/10/1931575.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值