概述

前面文章介绍了代理模式(在这里),代理模式和状态模式都提供一个代理类,从结构上看,可以认为代理模式只是状态模式的一个特例,不同之处在于,代理模式控制对其实现类的访问,而状态模式动态地改变其实现类,当发现大多数或者所有函数都存在条件代码时,这种模式很有用。

状态模式

简单来说,状态模式通过一个前端对象来使用后端实现对象履行其职责,在前端对象生存期期间,状态模式从一个实现对象到另一个实现对象进行切换,以实现对于相同的函数调用产生不同的行为。

示例:

#include <iostream>using namespace std;class Creature
{
public:Creature():isFrog(true) {}void kiss(){isFrog = false;}void greet(){if(isFrog){cout << "Ribbet!" << endl;}else{cout << "Dearling!" << endl;}}private:bool isFrog;
};int main()
{Creature creature;creature.greet();creature.kiss();creature.greet();return 0;
}

从上述代码可以看到,greet()等任何其他所有函数在执行操作前都必须测试变量 isFrog,这样让代码变得非常笨拙,特别是在系统中加入额外的状态时情况会更加严重。

接下来我们通过状态模式来修改以上示例,将操作委派给状态对象:


#include <iostream>using namespace std;class Creature
{
private:class State{public:virtual string response() = 0;virtual ~State();};class Frog : public State{public:string response(){return "Ribbet!";}virtual ~Frog();};class Prince : public State{public:string response(){return "Daring!";}virtual ~Prince();};State * state;public:Creature():state(new Frog()){}void greet(){cout << state->response() << endl;}void kiss(){delete state;state = new Prince();}
};int main()
{Creature creature;creature.greet();creature.kiss();creature.greet();return 0;
}

(这里为了简单,使用了类嵌套定义,可以不必这样做)

适用场景

在下面两种情况下均可以使用状态模式:

1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为;
2.一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State 模式将每一个条件分支放入一个独立的类中。这使得你可以根据自身情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。

C++设计模式--状态模式(state)相关推荐

  1. 趣谈设计模式 | 状态模式(State):如何实现游戏中的状态切换?

    文章目录 案例:马里奥积分竞赛 有限状态机 分支逻辑法 查表法 状态模式 状态模式与策略模式 总结 完整代码与文档 案例:马里奥积分竞赛 喜欢马里奥的小伙伴们都应该知道,前不久马里奥为了庆祝35周年, ...

  2. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  3. C++设计模式——状态模式(state pattern)

    一.原理讲解 别名状态对象(object for state). 1.1意图 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 1.2应用场景 一个对象的行为取决于它的状态,并 ...

  4. php 状态模式,PHP设计模式(十九)—状态模式 (State Pattern)

    状态模式 (State Pattern) :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类.其别名为状态对象(Objects for States) (一)为什么需要状态模式 ...

  5. Python设计模式-状态模式

    Python设计模式-状态模式 代码基于3.5.2,代码如下; #coding:utf-8 #状态模式class state():def writeProgram(self,work):raise N ...

  6. Java 设计模式——状态模式

    概述 很多人在说状态模式的时候总拿策略模式来进行对比,可能他们的类图会有一点类似,可我却不认为他们有多么相像.你可以阅读<Java设计模式--策略模式>这篇博客,并与本文对比,以找到蛛丝马 ...

  7. c++状态模式state

    c++状态模式state 概念 角色和职责 案例 概念 State模式也叫状态模式,是行为设计模式的一种.State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样 ...

  8. 状态模式(State)-七十二变

    状态模式(State)-老孙七十二变 俺老孙来也-我是如来佛祖玉皇大帝观音菩萨指定取西经特派使者花果山水帘洞美猴王齐天大圣孙悟空啊!老孙的必杀技就是七十二变,没错比老外的变相怪杰还有牛逼许多. 关于老 ...

  9. C++设计模式——状态模式

    C++设计模式--状态模式 在实际开发中,我们经常会遇到这种情况:一个对象有多种状态,在每一个状态下,都会有不同的行为.那么在代码中我们经常是这样实现的.   1 2 3 4 5 6 7 8 9 10 ...

最新文章

  1. SQL教学思路《图书管理系统》习题二:插入数据
  2. mysql改存储引擎教程_MySQL中修改数据表存储引擎的三种方法
  3. 计算机专业顶尖会议论文,校友胡一公获计算机系统领域顶级会议ASPLOS 2019最佳论文奖...
  4. kali下生成web端后门
  5. 神经网络的反向传播推导实例
  6. 谷歌浏览器安卓_用谷歌服务更安全了,安卓手机可充当物理安全密匙
  7. 解决JQuery EasyUI onLoadSuccess执行两次的问题
  8. 基于tcp实现远程执行命令
  9. linux下clion使用教程,clion linux使用教程
  10. 中国电信中兴 B860AV 1.1-T线刷及卡刷固件和刷机教程.zip
  11. 《Spring开发指南》(夏昕著)学习总结
  12. (随笔)无人机集群通信组网系统—无人机自组网
  13. P5900 无标号无根树计数 题解
  14. 浅谈CFD(constant fraction discriminator恒比鉴相器)
  15. 「倍轻松」要上科创板,按摩器为什么总要和科技沾点边?
  16. 11. 符号和符号解析
  17. 【总结】初创公司用AWS搭建高扩展性架构
  18. Python pandas库|任凭弱水三千,我只取一瓢饮(4)
  19. 客户关系管理项目——用户登录模块设计
  20. php伪造来路301,使用 fsockopen 伪造来路

热门文章

  1. 2021年炼丹笔记最受欢迎的10篇技术文章
  2. 0325互联网新闻 | 腾讯游戏发布“追梦计划”品牌;2018年中国物联网业务收入同比增长72.9%...
  3. 一步搞清楚多态与类初始化的底层原理
  4. robot framework安装
  5. 《深入理解C++11:C++ 11新特性解析与应用》——1.3 C++11特性的分类
  6. 关于SharePoint部署Webpart的十个必读链接(downmoon)
  7. 你看我还有机会吗?这么GAN让我秃然荒了!
  8. ansys用什么cpu_ANSYS图形工作站与集群配置探讨201904-1
  9. linux fedora35安装、登录postgresql-14数据库命令整理
  10. centos7 minimal运行vue项目npm run serve时报错:Error: spawn xdg-open ENOENT --解决办法:yum install xdg-utils