常见设计模式的解析和实现(C++)之十七-State模式
来源:互联网 发布:idea mac 激活服务器 编辑:程序博客网 时间:2024/06/05 15:13
作用:
允许一个对象在其内部状态改变时改变它的行为.
UML结构图:
解析:
State模式主要解决的是在开发中时常遇到的根据不同的状态需要进行不同的处理操作的问题,而这样的问题,大部分人是采用switch-case语句进行处理的,这样会造成一个问题:分支过多,而且如果加入一个新的状态就需要对原来的代码进行编译.State模式采用了对这些不同的状态进行封装的方式处理这类问题,当状态改变的时候进行处理然后再切换到另一种状态,也就是说把状态的切换责任交给了具体的状态类去负责.同时,State模式和Strategy模式在图示上有很多相似的地方,需要说明的是两者的思想都是一致的,只不过封装的东西不同:State模式封装的是不同的状态,而Stategy模式封装的是不同的算法.
实现:
1)State.h
允许一个对象在其内部状态改变时改变它的行为.
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_Hclass 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);};#endif2)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;}
- 常见设计模式的解析和实现(C++)之十七-State模式
- 常见设计模式的解析和实现(C++)之十七-State模式
- 常见设计模式的解析和实现(C++)之十七-State模式
- 设计模式的解析和实现(C++)之十七-State模式
- 设计模式(十七)之State
- 常见设计模式的解析和实现(C++)---Adapt模式
- 设计模式解析和实现(C++, java)之二十--状态(state)模式
- 设计模式之(十七)状态模式State
- 常见设计模式的解析和实现(C++)之二十-Visitor模式
- 常见设计模式的解析和实现(C++)之十九-Memento模式
- 常见设计模式的解析和实现(C++)之十八-Iterator模式
- 常见设计模式的解析和实现(C++)之十六-Strategy模式
- 常见设计模式的解析和实现(C++)之十五-Observer模式
- 常见设计模式的解析和实现(C++)之十四-Command模式
- 常见设计模式的解析和实现(C++)之十三-FlyWeight模式
- 常见设计模式的解析和实现(C++)之十二-ChainOfResponsibility模式
- 常见设计模式的解析和实现(C++)之十一-TemplateMethod模式
- 常见设计模式的解析和实现(C++)之十-Proxy模式
- hibernate更新报错 java.util.ConcurrentModificationException
- Win7设好IIS,访问网站时遇到的一系列错误 “ 403.14---404.7---404.3”
- 大端、小端问题详解
- 第二章 信息化 规划与组织
- js获取节点 dom操作
- 常见设计模式的解析和实现(C++)之十七-State模式
- 网页配色:叠柔配色法
- 图说TechCrunch Disrupt NY 很艺术很幽默
- Quartz integration within Spring for Invoke SQL stored procedure
- NOPI用模板生成excel
- 指针-----函数指针
- C++ CString string 转换 最简单的方法
- linux的命令行成了 -bash-3.2# 如何解决
- 转载Java反射详解