设计模式笔记之---状态模式
来源:互联网 发布:淘宝 生意参谋 编辑:程序博客网 时间:2024/06/07 13:19
状态模式(State):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况,把状态的判断转义到表示不同状态的一系列类当中,可以把负责的判断逻辑简化。当遇到需要根据不同的状态进行不同的处理时,大多数是采用switch语句进行处理,但当逻辑过于复杂时,switch就会变得非常庞大,从而不利于修改和扩展。状态模式把各种状态转移逻辑分布到其子类中,从而减少了互相之间的依赖。
UML类图:
状态模式基本代码:
/********************************************************************filename: State.hcreated:2012-10-26author:firehoodpurpose:firehood 学设计模式之---状态模式*********************************************************************/#pragma once#include <iostream> using namespace std; class State; class Context{public:Context(State *pState);~Context();public:bool ChangeState(State *pState);void Request();private:State *m_pState;};class State{public:State(void){}virtual ~State(void){}public:virtual void Handle(Context *pContext) = 0;};class ConcreteStateA : public State{public:ConcreteStateA(){}~ConcreteStateA(){}public:void Handle(Context *pContext);};class ConcreteStateB : public State{public:ConcreteStateB(){}~ConcreteStateB(){}public:void Handle(Context *pContext);};class ConcreteStateC : public State{public:ConcreteStateC(){}~ConcreteStateC(){}public:void Handle(Context *pContext);};
/********************************************************************filename: State.cppcreated:2012-10-26author:firehoodpurpose:firehood 学设计模式之---状态模式*********************************************************************/#include "State.h"Context::Context(State *pState):m_pState(NULL){if(pState){m_pState = pState;}}Context::~Context(){if(m_pState){delete m_pState; m_pState = NULL;}}bool Context::ChangeState(State *pState){if(pState == NULL){return false;}if(m_pState){delete m_pState;m_pState = NULL;}m_pState = pState;return true;}void Context::Request(){if(m_pState){m_pState->Handle(this);}}void ConcreteStateA::Handle(Context *pContext){cout<<"处理状态A"<<endl;if(pContext){pContext->ChangeState(new ConcreteStateB());}}void ConcreteStateB::Handle(Context *pContext){cout<<"处理状态B"<<endl;if(pContext){pContext->ChangeState(new ConcreteStateC());}}void ConcreteStateC::Handle(Context *pContext){cout<<"处理状态C"<<endl;if(pContext){pContext->ChangeState(new ConcreteStateA());}}
客户端调用代码:
#include "State.h"#include <iostream>using namespace std;int main(int argc,char* argv[]){cout<<"*************************************"<<endl;cout<<"firehood 学设计模式之---状态模式"<<endl;cout<<"*************************************"<<endl; Context content = Context(new ConcreteStateA);content.Request();content.Request();content.Request();content.Request(); system("pause");return 0;}
运行结果:
*************************************
firehood 学设计模式之---状态模式
*************************************
处理状态A
处理状态B
处理状态C
处理状态A
请按任意键继续. . .
- 设计模式笔记之---状态模式
- 设计模式学习笔记之状态模式
- 设计模式学习笔记之状态模式
- Java设计模式笔记之状态模式
- 设计模式笔记之状态模式
- 设计模式之禅笔记-状态模式
- 《设计模式》笔记:状态模式
- 设计模式笔记-状态模式
- 设计模式笔记--状态模式
- 设计模式笔记:状态模式
- 设计模式学习笔记之(状态设计模式)…
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 如何让editplus保存时不生成.bak备份文件
- linux文件对传
- iOS开发视频教程—6.2对象所有权的基本概念和用法
- vim的d命令使用小技巧
- Adobe Flex Compiler (mxmlc) V4.1.0 所有配置变量列表
- 设计模式笔记之---状态模式
- Hadoop Map/Reduce教程
- silverlight datagrid列表枚举找控件
- General Patterns:Function Declarations - 创建匿名函数并将其赋给一个变量
- android 布局属性
- iOS开发视频教程—6.3详解dealloc方法
- Hadoop集群搭建
- Repeater分页
- linq 动态查询