设计模式--状态模式
来源:互联网 发布:淘宝宝贝关联阿里巴巴 编辑:程序博客网 时间:2024/06/10 04:14
状态模式的分类是属于对象行为型.首先是状态模式的定义:
当一个对象的内在状态发生改变时允许改变其行为,这个对象看起来是改变了其类.
状态模式的结构图:
适用性:
1 一个对象的行为取决与他的状态,并且在运行时刻可以根据状态改变他的行为
2 当一个操作中含有大量的判断分支语句,造成维护成本高的时候,此时可以把每一个判断分支放入独立的类中,使得每个判断分支都可以独立的发生变化,而不需要依赖其他的分支
协作
1 Context将于状态相关的请求委托给当前的ConcreteState类进行处理
2 Context可以将自身传递给进行处理状态的对象,使得具体状态类在必要时可以访问Context
3 Context是客户使用的接口,当客户配置好该接口后,客户通过Context与具体的处理状态的对象通信,不再直接与具体的状态类通信
4 Context或者是具体的状态对象类可以决定哪个状态是哪个状态的后继者 和转换的条件
优点
1 状态模式将特定状态的行为局部化,并且将不同的状态行为分割开来。状态模式将状态封装在一个对象中,另外一个实现的方法是在Context中通过数值定义来定义状态的装换,但这样会使得出现相似的条件语句,State模式避免了这个问题。子类虽然增多了,但代码的结构化更加好,意图更加明显。
2 使得状态的转换显示化,通过数值转换状态往往不够明显,但通过子类的定义可以使得状态转换显示化
3 Stage对象可以被共享
注意
1 谁定义状态转换,状态转换如果是固定的,完全可以在context中定义。但如果分散在各个子类中,往往会更加灵活,缺点是各个子类产生了依赖
2 表驱动,可以用表来定义状态的转换,优点是不改变代码实现状态的转换。缺点是1 效率比较低,2 难以理解,3 难以加入伴随状态改变的动作
3 创建销毁状态对象
1 需要是在创建,当状态对象包含大量存储信息是适用
2 状态频繁改变时,适用
4 使用动态继承
例子
// StateModel.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "Work.h"int _tmain(int argc, _TCHAR* argv[]){ Work* project = new Work; project->setHour(9); project->writeProgram(); project->setHour(10); project->writeProgram(); project->setHour(12); project->writeProgram(); project->setHour(13); project->writeProgram(); project->setHour(14); project->writeProgram(); project->setHour(17); project->setTaskFinished(false); project->writeProgram(); project->setHour(19); project->writeProgram(); project->setHour(22); project->writeProgram(); delete project; project = nullptr; return 0;}/************************************************************************@fileName:Work.h @function: 状态模式的Context类@author: jaime@ver: 1.0.0************************************************************************/#pragma onceclass State;class ForenoonState;class Work{public: Work(); ~Work(); void setHour(int hour); int getHour(); void setTaskFinished(bool finish); bool getTaskFinished(); void setState(State* state); void writeProgram();private: State* m_current; int m_hour; bool m_finish;};#include "ForenoonState.h"#include "Work.h"Work::Work():m_current(new ForenoonState){}Work::~Work(){}void Work::setHour(int hour){ m_hour = hour;}int Work::getHour(){ return m_hour;}void Work::setTaskFinished(bool finish){ m_finish = finish;}bool Work::getTaskFinished(){ return m_finish;}void Work::setState(State* state){ m_current = state;}void Work::writeProgram(){ m_current->writeProgram(this);}/************************************************************************@fileName:State.h @function: 状态模式状态的基类@author: jaime@ver: 1.0.0************************************************************************/#pragma once#include "Work.h"class State{public: State(); ~State(); virtual void writeProgram(Work* work) = 0;private:};/************************************************************************@fileName:ForenoonState.h @function: 状态模式具体的状态子类@author: jaime@ver: 1.0.0************************************************************************/#pragma once#include "State.h"class ForenoonState : public State{public: ForenoonState(); ~ForenoonState(); virtual void writeProgram(Work* work);private:}; #include "ForenoonState.h"#include <iostream>#include "NoonState.h"using namespace std;ForenoonState::ForenoonState(){}ForenoonState::~ForenoonState(){}void ForenoonState::writeProgram(Work* work){ if ( work->getHour() < 12) { cout << "当前时间:" << work->getHour() << "精神百倍" <<endl; } else { work->setState(new NoonState); work->writeProgram(); }}/************************************************************************@fileName:AfternoonState.h@function: 状态模式具体的状态子类@author: jaime@ver: 1.0.0************************************************************************/#pragma once#include "State.h"class AfternoonState : public State{public: AfternoonState(); ~AfternoonState(); virtual void writeProgram(Work* work);private:};#include "AfternoonState.h"#include "EveningState.h"#include <iostream>using namespace std;AfternoonState::AfternoonState(){}AfternoonState::~AfternoonState(){}void AfternoonState::writeProgram(Work* work){ if (work->getHour() < 17) { cout << "当前时间:" << work->getHour() << "状态不错,继续努力" << endl; } else { work->setState(new EveningState); work->writeProgram(); }}/************************************************************************@fileName:EveningState.h@function: 状态模式具体的状态子类@author: jaime@ver: 1.0.0************************************************************************/#pragma once#include "State.h"class EveningState : public State{public: EveningState(); ~EveningState(); virtual void writeProgram(Work* work);private:};#include "EveningState.h"#include <iostream>#include "ResteState.h"#include "SleepingState.h"using namespace std;EveningState::EveningState(){}EveningState::~EveningState(){}void EveningState::writeProgram(Work* work){ if (work->getTaskFinished()) { work->setState(new ResteState); work->writeProgram(); } else { if (work->getHour() < 21) { cout << "当前时间:" << work->getHour() << "加班,劳累" << endl; } else { work->setState(new SleepingState); work->writeProgram(); } }}/************************************************************************@fileName:ResteState.h@function: 状态模式具体的状态子类@author: jaime@ver: 1.0.0************************************************************************/#pragma once#include "State.h"class ResteState : public State{public: ResteState(); ~ResteState(); virtual void writeProgram(Work* work);private:};#include "ResteState.h"#include <iostream>using namespace std;ResteState::ResteState(){}ResteState::~ResteState(){}void ResteState::writeProgram(Work* work){ cout << "当前时间:" << work->getHour() << "回家了" << endl;}/************************************************************************@fileName:SleepingState.h@function: 状态模式具体的状态子类@author: jaime@ver: 1.0.0************************************************************************/#pragma once#include "State.h"class SleepingState : public State{public: SleepingState(); ~SleepingState(); virtual void writeProgram(Work* work);private:};#include "SleepingState.h"#include <iostream>using namespace std;SleepingState::SleepingState(){}SleepingState::~SleepingState(){}void SleepingState::writeProgram(Work* work){ cout << "当前时间:" << work->getHour() << "受不了了睡觉了" << endl;}
- 设计模式:状态模式
- 设计模式-----状态模式
- 设计模式 状态模式
- 设计模式 - 状态模式
- 设计模式---状态模式
- 设计模式-状态模式
- 设计模式:状态模式
- 设计模式 - 状态模式
- 设计模式-状态模式
- 设计模式--状态模式
- 设计模式-状态模式
- 设计模式:状态模式
- 设计模式-状态模式
- 设计模式-状态模式
- [设计模式]状态模式
- 设计模式 状态模式
- 设计模式--状态模式
- 设计模式--状态模式
- Dns的概念
- lintcode 有效的括号序列
- Lua 5.3 参考手册 (1)
- ToolBar、TabLayout加角标无从下手?且看一看我的解决方法!
- hdu1575 Tr A(矩阵快速幂)
- 设计模式--状态模式
- tomcat启动startup.bat一闪而过
- 时间复杂度和空间复杂度详解
- Qt On Android开发环境安装、配置
- 京东注册页面
- hdu1588 Gauss Fibonacci(矩阵快速幂+二分求矩阵等比和)
- 从零开始学 iOS 开发的15条建议
- javaScript的设计模式之单例模式
- 如何正确获得ListView的每一个item高度