设计模式----State(状态)
2010-02-06 23:08
525 查看
作用:
允许一个对象在其内部状态改变时改变它的行为.
UML结构图:
![](http://img.ddvip.com/2009_03_29/1238319522_ddvip_9990.jpeg)
解析:
State模式主要解决的是在开发中时常遇到的根据不同的状态需要进行不同的处理操作的问题,而这样的问题,大部分人是采用switch-case语句进行处理的,这样会造成一个问题:分支过多,而且如果加入一个新的状态就需要对原来的代码进行编译.State模式采用了对这些不同的状态进行封装的方式处理这类问题,当状态改变的时候进行处理然后再切换到另一种状态,也就是说把状态的切换责任交给了具体的状态类去负责.同时,State模式和Strategy模式在图示上有很多相似的地方,需要说明的是两者的思想都是一致的,只不过封装的东西不同:State模式封装的是不同的状态,而Stategy模式封装的是不同的算法.
实现代码:
允许一个对象在其内部状态改变时改变它的行为.
UML结构图:
![](http://img.ddvip.com/2009_03_29/1238319522_ddvip_9990.jpeg)
解析:
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; }
相关文章推荐
- 设计模式之状态模式(State)
- 设计模式之美:State(状态)
- 设计模式二十二:state(状态模式)——对象行为型模式
- State状态设计模式
- 《模式——工程化实现及扩展》(设计模式C# 版)《状态模式 State》——“自我检验" 参考答案
- 设计模式 ( 十七) 状态模式State(对象行为型)
- 设计模式C++学习笔记之十九(State状态模式)
- 【JAVA】设计模式之状态模式(State模式)的使用分析
- 设计模式实现(十二)--- 状态模式(State)
- 设计模式 (十六)状态模式(State)
- 设计模式:状态模式(State)
- java设计模式:状态模式 State
- 设计模式-状态模式-state-python
- Java从设计模式[本场比赛状态转换武器]状态分析(State)模式
- 设计模式(3)- 状态设计模式State
- 浅谈JAVA设计模式之——状态模式(State)
- C++设计模式 之 “状态变化” 模式:State、Memento
- Android与设计模式——状态(State)模式
- 实战设计模式系列-State(状态)