c++ 状态模式(state)
/************************************************************************/
/* 状态模式 */
/************************************************************************/
#include <iostream> using namespace std; /*
一个状态接口,不同的状态从该接口中继承出来,想要增加新的状态
时,只需从此接口中派生出新的类即可,适合于当判断较多(多个状态切换频繁)的场合 这里引入一个程序员写工程程序的例子,程序员在一天的不同时间会处于不同的状态
如果程序写不完还得加班,即程序员的状态会随着时间发生改变
*/
class Work; /*状态接口State*/
class State
{
public:
virtual void WriteProgram(Work *w) = ;//写程序的行为(与Work相关的行为)
}; //工作类
class Work
{
private:
State *current;//当前状态
double hour;
bool taskFinish; public:
Work()
{
taskFinish = false;
} void SetTime(double hour)
{
this->hour = hour;
} double GetTime()
{
return this->hour;
} //设置状态
void SetState(State *s)
{
current = s;
} //设置工程是否完成
void SetFinish()
{
taskFinish = true;
} bool GetFinish()
{
return taskFinish;
} void WriteProgram()
{
current->WriteProgram(this);
} }; //下班休息状态
class RestState : public State
{
public:
void WriteProgram(Work *w)
{
cout<<"当前时间:"<<w->GetTime()<<"点 工作完成,下班回家了"<<endl;
} }; //睡眠工作状态
class SleepingState : public State
{
public:
void WriteProgram(Work *w)
{
cout<<"受不了了,"<<w->GetTime()<<"点了,先睡吧"<<endl;
} }; //晚上工作状态
class EveningState : public State
{
public:
void WriteProgram(Work *w)
{
//任务完成了,可以休息了
if(w->GetFinish())
{
w->SetState(new RestState());
w->WriteProgram();
}else
{
if(w->GetTime()<){
cout<<"当前时间:"<<w->GetTime()<<"点 加班了,疲惫至极"<<endl;
}else
{
//找过21点
w->SetState(new SleepingState());
w->WriteProgram();
}
}
} }; //下午工作状态
class AfternoonState : public State
{ public:
void WriteProgram(Work *w)
{
if(w->GetTime()<)
{
cout<<"当前时间:"<<w->GetTime()<<"点 状态还不错,继续努力"<<endl;
}else
{
w->SetState(new EveningState());
w->WriteProgram();
}
}
}; //中午工作状态
class NoonState : public State
{
public:
void WriteProgram(Work *w)
{
if (w->GetTime()<)
cout<<"当前时间:"<<w->GetTime()<<"点 饿了,午饭:犯困,午休"<<endl;
else
{
w->SetState(new AfternoonState());
w->WriteProgram();
}
} }; //上午工作状态
class ForenoonState : public State
{
public:
void WriteProgram(Work *w)
{
if(w->GetTime()<)
cout<<"当前时间:"<<w->GetTime()<<"点 上午工作,精神百倍"<<endl;
else
{
w->SetState(new NoonState());
w->WriteProgram();
}
} }; void main()
{
//紧急项目
Work *emergencyProjects = new Work();
emergencyProjects->SetState(new ForenoonState());
emergencyProjects->SetTime();
emergencyProjects->WriteProgram(); emergencyProjects->SetTime();
emergencyProjects->WriteProgram(); emergencyProjects->SetTime();
emergencyProjects->WriteProgram(); emergencyProjects->SetTime();
emergencyProjects->WriteProgram(); //完成工作,不需要再加班了
//emergencyProjects->SetFinish(); emergencyProjects->SetTime();
emergencyProjects->WriteProgram(); emergencyProjects->SetTime();
emergencyProjects->WriteProgram(); }
c++ 状态模式(state)的更多相关文章
- 【转】设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 二十四种设计模式:状态模式(State Pattern)
状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...
- 设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 乐在其中设计模式(C#) - 状态模式(State Pattern)
原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...
- 状态模式-State Pattern(Java实现)
状态模式-State Pattern 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. State接口 ...
- 北风设计模式课程---状态模式State(对象行为型)
北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...
- 状态模式(State)-设计模式
软件模式是将模式的一般概念应用于软件开发领域,即软件开发的 总体指导思路或参照样板.软件模式并非仅限于设计模式,还包括 架构模式.分析模式和过程模式等,实际上,在软件生存期的每一个阶段都存在着一些被认 ...
- 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)
说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...
- 十一个行为模式之状态模式(State Pattern)
定义: 当一个对象有多个状态,并且在每个状态下有不同的行为,可以使用状态模式来在其内部改变状态时改变其行为,而客户端不会察觉状态的改变,仍使用同样的方法或接口与对象进行交互. 结构图: Context ...
- 状态模式(State Pattern)
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂 ...
随机推荐
- (转)SpringSecurity扩展User类,获取Session
1.在session中取得spring security的登录用户名如下 ${session.SPRING_SECURITY_CONTEXT.authentication.principal.user ...
- Linux:常用快捷键
按键 作用 Ctrl+d 键盘输入结束或退出终端 Ctrl+s 暂定当前程序,暂停后按下任意键恢复运行 Ctrl+z 将当前程序放到后台运行,恢复到前台为命令fg Ctrl+a 将光标移至输入行头,相 ...
- Spring MVC + jpa框架搭建,及全面分析
一,hibernate与jpa的关系 首先明确一点jpa是什么?以前我就搞不清楚jpa和hibernate的关系. 1,JPA(Java Persistence API)是Sun官方提出的Java持久 ...
- 浅谈压缩感知(二十七):压缩感知重构算法之稀疏度自适应匹配追踪(SAMP)
主要内容: SAMP的算法流程 SAMP的MATLAB实现 一维信号的实验与结果 稀疏度K与重构成功概率关系的实验与结果 一.SAMP的算法流程 前面所述大部分OMP及其前改算法都需要已知信号的稀疏度 ...
- paip.提升效率---提升绑定层次--form绑定取代field绑定
paip.提升效率---提升绑定层次--form绑定取代field绑定 =================== 编辑form中,常常需要,绑定一个对象到个form.. 传统上要绑定field开始. ...
- (谷歌浏览器等)解决css中点击input输入框时出现外边框方法【outline:medium;】
问题:在使用谷歌浏览器,360浏览器时,点击input输入框会出现带颜色的外边框,如下图所示:
- VC2010 调用 Webservice
开发环境:VC2010,gsoap_2.8.23 http://blog.csdn.net/zhaiwenjuan/article/details/6590941 使用soapcpp2的时候要加参数- ...
- Android BitmapShader 实战 实现圆形、圆角图片
转载自:http://blog.csdn.net/lmj623565791/article/details/41967509 1.概述 记得初学那会写过一篇博客Android 完美实现图片圆角和圆形( ...
- ArrayList/Vector的原理、线程安全和迭代Fail-Fast
疑问 * ArrayList是非线程非安全的,具体是指什么?具体会产生什么问题?* ArrayList的内部原理是什么?为什么可以动态扩容?* Vector是线程安全的,具体是如何实现的?为什么不再推 ...
- ASP 中 Cookies 的 Expires 属性的设置(JS版本)
直接上代码,代码中有注释 <%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%> <% var numVisi ...