状态模式包含如下角色:

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

2)适用场景:

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

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

State.h

  1. #ifndef STATE
  2. #define STATE
  3. extern class Work;
  4.  
  5. class State
  6. {
  7. public:
  8. State(){};
  9. virtual void writeProgram(Work* w){};
  10. };
  11.  
  12. class ForenoonState :public State
  13. {
  14. public:
  15. void writeProgram(Work* w);
  16. };
  17.  
  18. class NoonState :public State
  19. {
  20. public:
  21. void writeProgram(Work* w);
  22. };
  23.  
  24. class AfternoonState :public State
  25. {
  26. public:
  27. void writeProgram(Work* w);
  28. };
  29.  
  30. class RestState :public State
  31. {
  32. public:
  33. void writeProgram(Work* w);
  34. };
  35.  
  36. #endif

state.cpp

  1. #include <iostream>
  2. #include "State.h"
  3. #include "Work.h"
  4.  
  5. using namespace std;
  6.  
  7. void ForenoonState :: writeProgram(Work* w)
  8. {
  9. if (w->getHour() < )
  10. cout << "当前时间:" << w->getHour() << "点 " << "ForenoonState,精神百倍" << endl;
  11. else
  12. {
  13. w->setState(new NoonState);//下一个状态
  14. w->writeProgram();
  15. }
  16. }
  17.  
  18. void NoonState:: writeProgram(Work* w)
  19. {
  20. if (w->getHour() < )
  21. cout << "当前时间:" << w->getHour() << "点 " << "NoonState,精神百倍" << endl;
  22. else
  23. {
  24. w->setState(new AfternoonState);//下一个状态
  25. w->writeProgram();
  26. }
  27. }
  28.  
  29. void AfternoonState :: writeProgram(Work* w)
  30. {
  31.  
  32. if (w->getHour() < )
  33. cout << "当前时间:" << w->getHour() << "点 " << "AfternoonState,精神百倍" << endl;
  34. else
  35. {
  36. w->setState(new RestState);//下一个状态
  37. w->writeProgram();
  38. }
  39.  
  40. }
  41.  
  42. void RestState:: writeProgram(Work* w)
  43. {
  44. cout << "当前时间:" << w->getHour() << "点 " << "RestState,精神百倍" << endl;
  45.  
  46. }

work.h

  1. #ifndef WORK
  2. #define WORK
  3.  
  4. #include "State.h"
  5. class Work
  6. {
  7. private:
  8. State* currnetState;
  9. double Hour;
  10. bool finish;
  11. public:
  12. Work();
  13. ~Work();
  14. double getHour();
  15. void setHour(double h);
  16.  
  17. bool getFinish();
  18. void setFinish(bool f);
  19.  
  20. void setState(State* s);
  21. void writeProgram();
  22. };
  23.  
  24. #endif

work.cpp

  1. #include "Work.h"
  2.  
  3. Work::Work(){
  4. currnetState = new ForenoonState;
  5. Hour = ;
  6. finish = false;
  7. }
  8. Work::~Work()
  9. {
  10. if (currnetState != )
  11. delete currnetState;
  12. }
  13.  
  14. double Work::getHour()
  15. {
  16. return Hour;
  17. }
  18. void Work::setHour(double h)
  19. {
  20. Hour = h;
  21. }
  22.  
  23. bool Work::getFinish()
  24. {
  25. return finish;
  26. }
  27. void Work::setFinish(bool f)
  28. {
  29. finish = f;
  30. }
  31.  
  32. void Work::setState(State* s)
  33. {
  34. if (currnetState != )
  35. delete currnetState;
  36.  
  37. currnetState = s;
  38. }
  39.  
  40. void Work::writeProgram()
  41. {
  42. currnetState->writeProgram(this);
  43. }

main.cpp

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include "Work.h"
  4. //#include "State.h"
  5.  
  6. using namespace std;
  7.  
  8. void main()
  9. {
  10. Work emergencyProjects;
  11.  
  12. emergencyProjects.setHour();
  13. emergencyProjects.writeProgram();
  14.  
  15. emergencyProjects.setHour();
  16. emergencyProjects.writeProgram();
  17.  
  18. emergencyProjects.setHour();
  19. emergencyProjects.writeProgram();
  20.  
  21. emergencyProjects.setHour();
  22. emergencyProjects.writeProgram();
  23.  
  24. emergencyProjects.setHour();
  25. emergencyProjects.writeProgram();
  26.  
  27. emergencyProjects.setHour();
  28. emergencyProjects.writeProgram();
  29.  
  30. emergencyProjects.setFinish(false);
  31.  
  32. emergencyProjects.setHour();
  33. emergencyProjects.writeProgram();
  34.  
  35. emergencyProjects.setHour();
  36. emergencyProjects.writeProgram();
  37.  
  38. system("pause");
  39. }

《大话设计模式》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. [git] 关闭 git branch 的pager

    高版本的git做了pager的调整. git diff git log git branch 等命令都用了pager, 默认的pager用了less 在我的应用里, 通常branch只有那么3,5个. ...

  2. SQL常用语法大全

    一. Table 增加列 1.增加列:alter table tableName add columnName varchar(30) 1.2. 修改列类型:alter table tableName ...

  3. 关于linux特殊含义的转义符\033

    格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[0m" 例如: echo -e "\033[41;36m something here \033 ...

  4. Matlab中添加路径与去除路径

    今天在使用Matlab调用内部的PCA函数的时候,报错: 错误使用 pca输入参数太多. 如下图所示: 网上查找原因之后发现是因为我之前下载过开源的工具包toolbox,并且将它的路径add到了Mat ...

  5. 用Eclipse构建Maven项目

    Eclipse中m2eclipse插件的安装 Help>Install New Software Click Add Name: m2e Location: http://download.ec ...

  6. 为什么要使用 Docker(二)

    作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势. 更高效的利用系统资源 由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高.无 ...

  7. logback logback.xml常用配置详解(二)<appender>

    转自:http://aub.iteye.com/blog/1101260 logback 常用配置详解(二) <appender> <appender>: <append ...

  8. MySQL分支Percona

    MySQL分支Percona 转载自:http://www.cnblogs.com/cevin/archive/2012/05/12/2496859.html 官方网站:http://www.perc ...

  9. adb移动端测试

    1. Android介绍 Android 是google公司主导的一个开放的手机操作系统,不过目前已经超过了手机的局限,而定位于移动设备的操作系统. Android一词的本义指“机器人”,取名原因很简 ...

  10. Python中__repr__和__str__区别(转)

    class Test(object): def __init__(self, value='hello, world!'): self.data = value >>> t = Te ...