您的位置:首页 > 其它

设计模式----State(状态)

2010-02-06 23:08 525 查看
作用:

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

  UML结构图:



解析:

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

实现代码:
#include <iostream>
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);
};

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());
}
}

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

delete pContext;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: