代码写的不够规范,目的是为了缩短篇幅,实际中请不要这样做

参看:https://www.runoob.com/design-pattern/state-pattern.html

1、概述

  这个有点抽象,我的理解是: 行为受到状态的变化而变化。举一个例子,篮球员动员,如果运动员这会儿状态好,命中率(投球)就会上升。再比如人的情绪变化,可能会导致不同的行为。比如高兴,是动作A,犹豫,动作B。

  

  需要用的角色,主要分为2类,A、状态(state),B、上下文(context)。

2、抽象状态

  1. // 抽象状态
  2. class oct_state
  3. {
  4. public:
  5. virtual void do_action(oct_context *pct) = 0;
  6.  
  7. // 用于将上下文的状态输出
  8. virtual std::string to_str() = 0;
  9.  
  10. protected:
  11. std::string _str_state;
  12. };

3、状态有多种,下面举例用到了2个A和B:

  1. // 状态A
  2. class oct_state_A : public oct_state
  3. {
  4. // 实现接口
  5. void do_action(oct_context *pct)
  6. {
  7. // 1、输出当前发状态
  8. std::cout << "\n状态变化了,现在正处于状态A\n";
  9.  
  10. // 2、告诉上下文,已经进入了状态A
  11. if (pct)
  12. pct->set_state(this);
  13.  
  14. _str_state = std::string("状态A");
  15. }
  16.  
  17. std::string to_str() { return _str_state; }
  18.  
  19. };
  20.  
  21. // 状态B
  22. class oct_state_B : public oct_state
  23. {
  24. void do_action(oct_context *pct)
  25. {
  26. // 1、输出当前发状态
  27. std::cout << "\n状态变化了,现在正处于状态B\n";
  28.  
  29. // 2、告知上下文,进入了状态B
  30. if (pct)
  31. pct->set_state(this);
  32.  
  33. _str_state = std::string("状态B");
  34. }
  35.  
  36. std::string to_str() { return _str_state; }
  37. };

4、上下文(context)

  1. class oct_context
  2. {
  3. public:
  4. void set_state(oct_state *ps)
  5. {
  6. if (ps)
  7. _pstate = ps;
  8. }
  9.  
  10. oct_state * get_state() { return _pstate; }
  11.  
  12. private:
  13. oct_state *_pstate = nullptr;
  14. };

5、调用

  1. 1 void call_state()
  2. 2 {
  3. 3 // 1、创建上下文和状态AB
  4. 4 std::unique_ptr<oct_context> pcontext(new(std::nothrow) oct_context);
  5. 5 std::unique_ptr<oct_state> pstateA(newnew(std::nothrow) oct_state_A);
  6. 6 std::unique_ptr<oct_state> pstateB(newnew(std::nothrow) oct_state_B);
  7. 7
  8. 8 if (!pcontext || !pstateA || !pstateB)
  9. 9 {
  10. 10 std::cout << "\n创建状态AB或者创建上下文对象失败\n";
  11. 11 return;
  12. 12 }
  13. 13
  14. 14 // 1、进入状态A
  15. 15 std::cout << "\n1、进入状态A\n";
  16. 16 pstateB->do_action(pcontext.get());
  17. 17
  18. 18 std::cout << "\n上下文输出:" << pcontext->get_state()->to_str().c_str() << endl;;
  19. 19
  20. 20 // 2、进入状态B
  21. 21 std::cout << "\n\n\n\n-----------------------------------\n2、进入状态B\n";
  22. 22 pstateB->do_action(pcontext.get());
  23. 23 std::cout << "\n上下文输出:" << pcontext->get_state()->to_str().c_str() << endl;;
  24. 24 }

6、结果:

c++设计模式概述之状态的更多相关文章

  1. OOAD-设计模式(二)之GRASP模式与GOF设计模式概述

    一.GRASP模式(通用责任分配软件模式)概述 1.1.理解责任 1)什么是责任 责任是类间的一种合约或义务,也可以理解成一个业务功能,包括行为.数据.对象的创建等 知道责任——表示知道什么 行为责任 ...

  2. PHP设计模式概述

    PHP设计模式概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. ...

  3. java设计模式概述

    java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模 ...

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

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

  5. 23种GoF设计模式概述

    23种GoF设计模式概述 在前面,我们对 GoF 的 23 种设计模式进行了分类,这里先对各个设计模式的功能进行简要介绍,以便有个大概了解.后面的章节再进行详细介绍. 创建型模式 关注于怎么创建对象的 ...

  6. Java设计模式(一):设计模式概述、UML图、设计原则

    1 设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...

  7. 设计模式(一)----设计模式概述及UML图解析

    1.设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...

  8. java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述

    在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...

  9. 【OOAD】设计模式概述

    模式的诞生与定义 模式起源于建筑业而非软件业模式(Pattern)之父——美国加利佛尼亚大学环境结构中心研究所所长Christopher Alexander博士<A Pattern Langua ...

随机推荐

  1. 『学了就忘』Linux文件系统管理 — 61、使用parted命令进行分区

    目录 1.parted命令介绍 2.parted交互模式 3.建立分区 (1)查看分区 (2)修改成GPT分区表 (3)建立分区 (4)建立文件系统(格式化) (5)调整分区大小 (6)删除分区 1. ...

  2. python 新闻管理系统——启示

    mysql取整函数: mysql函数ceil.floor.round mysql 取整 1.ceil() / ceiling() 向上取整 ex: ceil(1.2) = 2 2.floor() 向下 ...

  3. 【NCBI教程】资源汇总整理 (转载)

    主题 网址 备注 [NCBI教程]资源汇总整理 http://www.omicshare.com/forum/thread-200-1-1.html (出处: OmicShare Forum)

  4. Linux搭建yum仓库

    1.安装nginx 2.为nginx搭建共享目录 3.安装createrepo,创建存储库 4.客户端测试 1.安装nginx yum list |grep nginx #查看是否有可用的nginx包 ...

  5. 11 — springboot集成swagger — 更新完毕

    1.前言 理论知识滤过,自行百度百科swagger是什么 2.导入依赖 <!-- swagger所需要的依赖--> <dependency> <groupId>io ...

  6. 淘宝、网易移动端 px 转换 rem 原理,Vue-cli 实现 px 转换 rem

       在过去的一段时间里面一直在使用Vue配合 lib-flexible和px2rem-loader配合做移动端的网页适配.秉着求知的思想,今天决定对他的原理进行分析.目前网上比较主流使用的就是淘宝方 ...

  7. E面波导和H面波导的问题

    我感觉与窄壁平行是E面,反之为H面.通常E面(窄面)是指与电场方向平行的方向图切面(窄面):H面(宽面)是指与磁场方向平行的方向图切面(宽面).E面的意思是... ElevationH面的意思是... ...

  8. 100个Shell脚本——【脚本2】截取字符串

    [脚本2]截取字符串 一.脚本 现有一个字符串如下: http://www.aaa.com/root/123.htm 请根据以下要求截取出字符串中的字符: 1.取出www.aaa.com/root/1 ...

  9. mysql报错max_connections错误

    SELECT @@MAX_CONNECTIONS AS 'Max Connections';set GLOBAL max_connections=10000; show status like '%t ...

  10. java加密方式

    加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容.大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些 ...