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)
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂 ...
随机推荐
- PDB调试Python程序
pdb是python内置的调试工具, 它可以在终端中调试Python程序, 这允许pdb在很多无法安装IDE的服务器上使用. 虽然远程调试使用广泛, 但在必要的时候(比如难以在本地搭建运行环境)pdb ...
- 在Github上注册账户
首先打开网址:https://github.com/ 进行注册 注册完成后进入邮箱验证 在右上角创建一个简单的项目仓库 创建完成
- [游戏学习24] MFC 各种绘图 字体学习
>_<:这里包含字体设置及各种绘图,只要稍微看一下代码就能理解,这里不多介绍 >_<:Hello.h #include<afxwin.h> class CMyApp ...
- ueditor编辑器和at.js集成
源码: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8&qu ...
- 【软件架构】IM架构设计(安卓版)
1. 架构总览 2. 模块介绍 2.1 协议封装与任务流程 2.1.1 协议与任务的封装 协议有协议头(协议头因为格式相同,被抽象出来)和协议体组成,协议有两类:请求协议(request)和回复协议( ...
- jQuery/javascript实现简单网页计算器
<html> <head> <meta charset="utf-8"> <title>jQuery实现</title> ...
- 地图源改变之后mxd文件打开很慢的问题
在使用ArcGIS开发电子地图程序时,有时候需要更换服务器地址,这时打开MXD文件就会非常慢,一直没有找到有效的方法,下面是从网上搜到的方法,还没有验证,下次再碰到这个问题的时候,验证一下: (以下方 ...
- python判断文件和目录是否存在
#Python的os.path模块提供了 isdir() 和 isfile()函数,请导入该模块,并调用函数判断指定的目录和文件是否存在. import os print os.path.isdir( ...
- Arduino单片机使用和开发问题记录
1.将程序上传到板子时Arduino IDE提示“avrdude: stk500_getsync(): not in sync: resp=0x00” 网上查遇到这个问题的人比较多,有说驱动问题的,有 ...
- Cause for NullPointerException android.support.v7.widget.RecyclerView.onMeasure
because you have not set LinearLayoutManager to RecyclerView. for example: mRecyclerView = (Recycler ...