状态模式包含如下角色:

  • Context: 环境类
  • State: 抽象状态类
  • ConcreteState: 具体状态类

2)适用场景:

a)状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判 断逻辑简单化。(简单来说,就是把各种if else 转变成了一个个的具体状态,原来if else 每种情况下的操作现在转换到了某个具体状态中)

b)当一个对象行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。

State.h

 #ifndef STATE
#define STATE
extern class Work; class State
{
public:
State(){};
virtual void writeProgram(Work* w){};
}; class ForenoonState :public State
{
public:
void writeProgram(Work* w);
}; class NoonState :public State
{
public:
void writeProgram(Work* w);
}; class AfternoonState :public State
{
public:
void writeProgram(Work* w);
}; class RestState :public State
{
public:
void writeProgram(Work* w);
}; #endif

state.cpp

 #include <iostream>
#include "State.h"
#include "Work.h" using namespace std; void ForenoonState :: writeProgram(Work* w)
{
if (w->getHour() < )
cout << "当前时间:" << w->getHour() << "点 " << "ForenoonState,精神百倍" << endl;
else
{
w->setState(new NoonState);//下一个状态
w->writeProgram();
}
} void NoonState:: writeProgram(Work* w)
{
if (w->getHour() < )
cout << "当前时间:" << w->getHour() << "点 " << "NoonState,精神百倍" << endl;
else
{
w->setState(new AfternoonState);//下一个状态
w->writeProgram();
}
} void AfternoonState :: writeProgram(Work* w)
{ if (w->getHour() < )
cout << "当前时间:" << w->getHour() << "点 " << "AfternoonState,精神百倍" << endl;
else
{
w->setState(new RestState);//下一个状态
w->writeProgram();
} } void RestState:: writeProgram(Work* w)
{
cout << "当前时间:" << w->getHour() << "点 " << "RestState,精神百倍" << endl; }

work.h

 #ifndef WORK
#define WORK #include "State.h"
class Work
{
private:
State* currnetState;
double Hour;
bool finish;
public:
Work();
~Work();
double getHour();
void setHour(double h); bool getFinish();
void setFinish(bool f); void setState(State* s);
void writeProgram();
}; #endif

work.cpp

 #include "Work.h"

 Work::Work(){
currnetState = new ForenoonState;
Hour = ;
finish = false;
}
Work::~Work()
{
if (currnetState != )
delete currnetState;
} double Work::getHour()
{
return Hour;
}
void Work::setHour(double h)
{
Hour = h;
} bool Work::getFinish()
{
return finish;
}
void Work::setFinish(bool f)
{
finish = f;
} void Work::setState(State* s)
{
if (currnetState != )
delete currnetState; currnetState = s;
} void Work::writeProgram()
{
currnetState->writeProgram(this);
}

main.cpp

 #include <iostream>
#include <cstdlib>
#include "Work.h"
//#include "State.h" using namespace std; void main()
{
Work emergencyProjects; emergencyProjects.setHour();
emergencyProjects.writeProgram(); emergencyProjects.setHour();
emergencyProjects.writeProgram(); emergencyProjects.setHour();
emergencyProjects.writeProgram(); emergencyProjects.setHour();
emergencyProjects.writeProgram(); emergencyProjects.setHour();
emergencyProjects.writeProgram(); emergencyProjects.setHour();
emergencyProjects.writeProgram(); emergencyProjects.setFinish(false); emergencyProjects.setHour();
emergencyProjects.writeProgram(); emergencyProjects.setHour();
emergencyProjects.writeProgram(); system("pause");
}

《大话设计模式》c++实现 状态模式的更多相关文章

  1. 大话设计模式Python实现-状态模式

    状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 下面是一个状态模式的demo: #!/usr/bin/env python # -*- ...

  2. 大话设计模式Python实现-备忘录模式

    备忘录模式(Memento Pattern):不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,这样已经后就可将该对象恢复到原先保存的状态 下面是一个备忘录模式的demo: #! ...

  3. 大话设计模式C++版——代理模式

    本篇开始前先发个福利,程杰的<大话设计模式>一书高清电子版(带目录)已上传至CSDN,免积分下载. 下载地址:http://download.csdn.net/detail/gufeng9 ...

  4. 大话设计模式C++版——工厂模式在COM中的典型应用

    上篇<大话设计模式C++版——抽象工厂模式>中,我们拯救世界未遂,留下小小的遗憾,本篇中我们将给出一个解决方案——COM组件技术,同时也顺便扯扯工厂模式在COM组件技术中的应用. 工厂模式 ...

  5. Java设计模式系列之状态模式

    状态模式(State)的定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它 ...

  6. Java设计模式学习记录-状态模式

    前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使 ...

  7. java设计模式-----22、状态模式

    概念: State模式也叫状态模式,是行为设计模式的一种.State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样. 根据这个概念,我们举个例子 public c ...

  8. 《Java设计模式》之状态模式

    状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式同意一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它 ...

  9. 大话设计模式Python实现-迭代器模式

    迭代器模式(Iterator Pattern):提供方法顺序访问一个聚合对象中各元素,而又不暴露该对象的内部表示. 下面是一个迭代器模式的demo: #!/usr/bin/env python # - ...

  10. 大话设计模式Python实现-解释器模式

    解释器模式(Interpreter Pattern):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 下面是一个解释器模式的demo: #!/usr/ ...

随机推荐

  1. [daily] 使用diff和patch打补丁

    diff org new > xxx.patch patch /path/org xxx.patch /path/org是相对路径时, 会报错. 这是一个bug.

  2. 【Linux】Linux 常用命令汇总

    查看软件xxx安装内容:dpkg -L xxx 查找软件库中的软件:apt-cache search 正则表达式 查找软件库中的软件:aptitude search 软件包 查找文件属于哪个包:dpk ...

  3. python作用域问题

    今天出了个低级的错误,最后确定是作用域问题,特回顾知识点如下: 在Python程序中创建.改变.查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域. Python的作 ...

  4. 遍历出文档内所有元素的tagName

    //深度优先 function deepLogTagNames(parentNode){ console.log(parentNode.tagName); const childNodes=paren ...

  5. [MySQL 5.6] information_schema.innodb_metrics

    1. 概括 已关闭/打开的配置 use information_schema select count(*), status from innodb_metrics group by status; ...

  6. 接口测试工具-Jmeter使用笔记(三:管理请求服务器信息和Headers参数)

    如果使用Jmeter同时执行多个http请求任务,就需要创建多个HTTP取样器,每一个取样器都来手动填写服务器信息和端口号,会非常消耗时间. 解决方法:Jmeter之HTTP请求默认值 1.添加方式 ...

  7. MySQL模拟Oralce闪回操作

    在前面的文章中我们介绍了MySQL误操作后数据恢复(update,delete忘加where条件),大概操作是通过sed命令把binlog中相关SQL误操作给逆向回来,然后导入SQL文件来恢复错误操作 ...

  8. shell分析日志常用指令合集

    数据分析对于网站运营人员是个非常重要的技能,日志分析是其中的一个.日志分析可以用专门的工具进行分析,也可以用原生的shell脚本执行,下面就随ytkah看看shell分析日志常用指令有哪些吧.(log ...

  9. laravel用crud修改产品items-新建resource controller和routing

    前面我们创建了laravel简单的items产品api,但是需要在数据库添加,如何在网页上直接添加呢?我们可以用view来操作crud(增加Create.读取查询Retrieve.更新Update和删 ...

  10. laravel dingo/api添加jwt-auth认证

    前面我们学了laravel dingo/api创建简单的api,这样api是开放给所有人的,如何查看和限制api的调用呢?可以用jwt-auth来验证,JSON Web Token Authentic ...