作用:
允许一个对象在其内部状态改变时改变它的行为.
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
#defineSTATE_H
classState;
classContext
{
public:
Context(StatepState);
~Context();
voidRequest();
voidChangeState(StatepState);
private:
Statem_pState;
};
classState
{
public:
virtual~State(){}
virtualvoidHandle(ContextpContext)=0;
};
classConcreateStateA
:publicState
{
public:
voidHandle(ContextpContext);
};
classConcreateStateB
:publicState
{
public:
voidHandle(ContextpContext);
};
#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(StatepState)
: m_pState(pState)
{
}
Context::~Context()
{
delete m_pState;
m_pState=NULL;
}
voidContext::Request()
{
if(NULL!=m_pState)
{
m_pState->Handle(this);
}
}
voidContext::ChangeState(StatepState)
{
if(NULL!=m_pState)
{
delete m_pState;
m_pState=NULL;
}
m_pState=pState;
}
voidConcreateStateA::Handle(ContextpContext)
{
std::cout<<"Handle by ConcreateStateAn";
if(NULL!=pContext)
{
pContext->ChangeState(newConcreateStateB());
}
}
voidConcreateStateB::Handle(ContextpContext)
{
std::cout<<"Handle by ConcreateStateBn";
if(NULL!=pContext)
{
pContext->ChangeState(newConcreateStateA());
}
}
3)Main.cpp
/*********
created: 2006/08/05
filename: Main.cpp
author: 李创
http://www.cppblog.com/converse/
purpose: State模式的测试代码
**********/
#include"State.h"
intmain()
{
StatepState=newConcreateStateA();
ContextpContext=newContext(pState);
pContext->Request();
pContext->Request();
pContext->Request();
delete pContext;
return0;
}
原文链接: https://www.cnblogs.com/weiqubo/archive/2011/01/10/1931575.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/19903
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!