现在的位置: 首页 > 综合 > 正文

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

2014年02月03日 ⁄ 综合 ⁄ 共 2684字 ⁄ 字号 评论关闭

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

UML结构图:

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

实现:
1)State.h

/********************************************************************
    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
{
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

/********************************************************************
    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)
{

}


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 ConcreateStateA/n";
    
    
if (NULL != pContext)
    
{
        pContext
->ChangeState(new ConcreateStateB());
    }

}


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

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

}

/**/


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

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


#include 
"State.h"

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

    delete pContext;

    
return 0;
}


/**/

抱歉!评论已关闭.