状态模式
来源:互联网 发布:无线端来源我的淘宝 编辑:程序博客网 时间:2024/06/06 10:06
定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不
同状态的一系列类中,可以把复杂的判断逻辑简化。
状态模式的结构图如下:
状态模式的适用场合:
(1) 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
(2) 一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。
下面是编写的一段代码,应用了状态模式的方法,更好地领悟了状态模式:
#include <iostream>using namespace std ;class Work ; //声明 class Forenoon ;class Noon ;class Afternoon ;class Evening ;class GoHome ;class State ;class State //状态类 {public:virtual void WriteProgram(Work * pWork) = 0 ; //当前状态纯虚函数 };class Work //工作类{State * pPresent ; //当前状态的指针 public:double dblHours ; //时间bool bFinish ; //任务完成情况Work() ;void Setstate(State* pState) //设置当前状态{pPresent = pState ;} void WorkProgram() //查看当前状态 {pPresent->WriteProgram(this) ;}};class Forenoon : public State //上午{public:void WriteProgram(Work * pWork) ;};class Noon : public State //中午{public:void WriteProgram(Work * pWork) ;}; class Afternoon : public State //下午{public:void WriteProgram(Work * pWork) ;}; class Evening : public State //晚上 {public:void WriteProgram(Work * pWork) ;}; class GoHome : public State //下班回家 {public:void WriteProgram(Work * pWork) {cout<<"当前时间为:" << pWork->dblHours<<"点 下班回家"<<endl ;}}; Work::Work(){bFinish = 0 ;pPresent = new Forenoon() ; //初始化为上午 }void Forenoon:: WriteProgram(Work * pWork){if(pWork->dblHours<11){cout<<"当前时间为:" << pWork->dblHours<<"点 上午工作,精神百倍"<<endl ;}else{pWork->Setstate(new Noon()) ; //超过12点则变为中午 pWork->WorkProgram() ;}}void Noon:: WriteProgram(Work * pWork){if(pWork->dblHours<13){cout<<"当前时间为:" << pWork->dblHours<<"点 吃午饭,休息,精神百倍"<<endl ;}else{pWork->Setstate(new Afternoon()) ; //超过13点则变为下午 pWork->WorkProgram() ;}}void Afternoon:: WriteProgram(Work * pWork){if(pWork->dblHours<17){cout<<"当前时间为:" << pWork->dblHours<<"点 下午工作还行"<<endl ;}else{pWork->Setstate(new Evening()) ; //超过17点则变为晚上 pWork->WorkProgram() ;}}void Evening:: WriteProgram(Work * pWork){if(pWork->bFinish){pWork->Setstate(new GoHome()) ; //超过17点则变为晚上 pWork->WorkProgram() ;}else{cout<<"当前时间为:" << pWork->dblHours<<"点 在加班,好辛苦"<<endl ;}}int main(){Work * pWork = new Work() ;pWork->dblHours = 10 ;pWork->WorkProgram() ;pWork->dblHours = 12 ;pWork->WorkProgram() ;pWork->dblHours = 16;pWork->WorkProgram() ;pWork->dblHours = 19 ;pWork->bFinish = 0 ;pWork->WorkProgram() ;pWork->dblHours = 20 ;pWork->bFinish = 1 ;pWork->WorkProgram() ; return 0 ;}
运行程序后的结果为:
阅读全文
0 0
- 状态模式(状态变化)
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 在vue项目中引入高德地图及其UI组件
- java中"=="和equals方法比较
- java虚拟机 Class类文件的结构
- 进程间通信 之 消息队列(Linux)
- 《C++高级编程》中的收获
- 状态模式
- Java基本数据类型和String相互转换
- Hadoop日记——分布式文件系统HDFS
- 项目实训第五周1
- hibernate对象的三种状态
- 再谈 GCD
- jQuery
- android studio jni 移植一个VS上开发的项目 使用了opencv
- Android基础之简单的绘图板