c++设计模式(9)-State模式
来源:互联网 发布:什么软件录屏有声音 编辑:程序博客网 时间:2024/06/06 10:39
作用:
允许一个对象在其内部状态改变时改变它的行为.
UML结构图:
解析:
State模式主要解决的是在开发中时常遇到的根据不同的状态需要进行不同的处理操作的问题,而这样的问题,大部分人是采用switch-case语句进行处理的,这样会造成一个问题:分支过多,而且如果加入一个新的状态就需要对原来的代码进行编译.State模式采用了对这些不同的状态进行封装的方式处理这类问题,当状态改变的时候进行处理然后再切换到另一种状态,也就是说把状态的切换责任交给了具体的状态类去负责.同时,State模式和Strategy模式在图示上有很多相似的地方,需要说明的是两者的思想都是一致的,只不过封装的东西不同:State模式封装的是不同的状态,而Stategy模式封装的是不同的算法.
实现:
1)State.h
filename: State.h
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
/**//********************************************************************
filename: State.cpp
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
filename: Main.cpp
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;
}
- 设计模式:State模式
- 设计模式--State 模式
- (9)设计模式:State
- c++设计模式(9)-State模式
- 设计模式之State
- 设计模式之State
- 设计模式之State
- 设计模式小议:state
- 设计模式之State
- 设计模式之State
- State设计模式
- 设计模式之State
- 设计模式之State
- 设计模式之State
- 设计模式之State
- 设计模式之State
- 设计模式之 state
- state-----设计模式
- 谁有惊天王V17.5版本的破解版
- 覆写 javascript中的window.confirm 显示yes/no 按钮
- 解决com.sun.xml.internal.ws.streaming.XMLStreamReaderException: unexpected XML tag.
- 30个漂亮的网页设计案例
- Android的SimpleAdapter
- c++设计模式(9)-State模式
- NALU(NAL单元)
- git—local--ssh
- jQuery Q&A
- 参加江总《从技术走向管理》讲座有感
- 获取控件所有事件列表
- Using GLib's GKeyFile Parser (使用GLib解析配置文件)
- SQL Server 2008中的MERGE(不仅仅是合并)
- SC --关于系统服务的一个命令详解