c++设计模式概述之状态
代码写的不够规范,目的是为了缩短篇幅,实际中请不要这样做
参看:https://www.runoob.com/design-pattern/state-pattern.html
1、概述
这个有点抽象,我的理解是: 行为受到状态的变化而变化。举一个例子,篮球员动员,如果运动员这会儿状态好,命中率(投球)就会上升。再比如人的情绪变化,可能会导致不同的行为。比如高兴,是动作A,犹豫,动作B。
需要用的角色,主要分为2类,A、状态(state),B、上下文(context)。
2、抽象状态
- // 抽象状态
- class oct_state
- {
- public:
- virtual void do_action(oct_context *pct) = 0;
- // 用于将上下文的状态输出
- virtual std::string to_str() = 0;
- protected:
- std::string _str_state;
- };
3、状态有多种,下面举例用到了2个A和B:
- // 状态A
- class oct_state_A : public oct_state
- {
- // 实现接口
- void do_action(oct_context *pct)
- {
- // 1、输出当前发状态
- std::cout << "\n状态变化了,现在正处于状态A\n";
- // 2、告诉上下文,已经进入了状态A
- if (pct)
- pct->set_state(this);
- _str_state = std::string("状态A");
- }
- std::string to_str() { return _str_state; }
- };
- // 状态B
- class oct_state_B : public oct_state
- {
- void do_action(oct_context *pct)
- {
- // 1、输出当前发状态
- std::cout << "\n状态变化了,现在正处于状态B\n";
- // 2、告知上下文,进入了状态B
- if (pct)
- pct->set_state(this);
- _str_state = std::string("状态B");
- }
- std::string to_str() { return _str_state; }
- };
4、上下文(context)
- class oct_context
- {
- public:
- void set_state(oct_state *ps)
- {
- if (ps)
- _pstate = ps;
- }
- oct_state * get_state() { return _pstate; }
- private:
- oct_state *_pstate = nullptr;
- };
5、调用
- 1 void call_state()
- 2 {
- 3 // 1、创建上下文和状态AB
- 4 std::unique_ptr<oct_context> pcontext(new(std::nothrow) oct_context);
- 5 std::unique_ptr<oct_state> pstateA(newnew(std::nothrow) oct_state_A);
- 6 std::unique_ptr<oct_state> pstateB(newnew(std::nothrow) oct_state_B);
- 7
- 8 if (!pcontext || !pstateA || !pstateB)
- 9 {
- 10 std::cout << "\n创建状态AB或者创建上下文对象失败\n";
- 11 return;
- 12 }
- 13
- 14 // 1、进入状态A
- 15 std::cout << "\n1、进入状态A\n";
- 16 pstateB->do_action(pcontext.get());
- 17
- 18 std::cout << "\n上下文输出:" << pcontext->get_state()->to_str().c_str() << endl;;
- 19
- 20 // 2、进入状态B
- 21 std::cout << "\n\n\n\n-----------------------------------\n2、进入状态B\n";
- 22 pstateB->do_action(pcontext.get());
- 23 std::cout << "\n上下文输出:" << pcontext->get_state()->to_str().c_str() << endl;;
- 24 }
6、结果:
c++设计模式概述之状态的更多相关文章
- OOAD-设计模式(二)之GRASP模式与GOF设计模式概述
一.GRASP模式(通用责任分配软件模式)概述 1.1.理解责任 1)什么是责任 责任是类间的一种合约或义务,也可以理解成一个业务功能,包括行为.数据.对象的创建等 知道责任——表示知道什么 行为责任 ...
- PHP设计模式概述
PHP设计模式概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. ...
- java设计模式概述
java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模 ...
- Java设计模式学习记录-状态模式
前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使 ...
- 23种GoF设计模式概述
23种GoF设计模式概述 在前面,我们对 GoF 的 23 种设计模式进行了分类,这里先对各个设计模式的功能进行简要介绍,以便有个大概了解.后面的章节再进行详细介绍. 创建型模式 关注于怎么创建对象的 ...
- Java设计模式(一):设计模式概述、UML图、设计原则
1 设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...
- 设计模式(一)----设计模式概述及UML图解析
1.设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...
- java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述
在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...
- 【OOAD】设计模式概述
模式的诞生与定义 模式起源于建筑业而非软件业模式(Pattern)之父——美国加利佛尼亚大学环境结构中心研究所所长Christopher Alexander博士<A Pattern Langua ...
随机推荐
- 『学了就忘』Linux文件系统管理 — 61、使用parted命令进行分区
目录 1.parted命令介绍 2.parted交互模式 3.建立分区 (1)查看分区 (2)修改成GPT分区表 (3)建立分区 (4)建立文件系统(格式化) (5)调整分区大小 (6)删除分区 1. ...
- python 新闻管理系统——启示
mysql取整函数: mysql函数ceil.floor.round mysql 取整 1.ceil() / ceiling() 向上取整 ex: ceil(1.2) = 2 2.floor() 向下 ...
- 【NCBI教程】资源汇总整理 (转载)
主题 网址 备注 [NCBI教程]资源汇总整理 http://www.omicshare.com/forum/thread-200-1-1.html (出处: OmicShare Forum)
- Linux搭建yum仓库
1.安装nginx 2.为nginx搭建共享目录 3.安装createrepo,创建存储库 4.客户端测试 1.安装nginx yum list |grep nginx #查看是否有可用的nginx包 ...
- 11 — springboot集成swagger — 更新完毕
1.前言 理论知识滤过,自行百度百科swagger是什么 2.导入依赖 <!-- swagger所需要的依赖--> <dependency> <groupId>io ...
- 淘宝、网易移动端 px 转换 rem 原理,Vue-cli 实现 px 转换 rem
在过去的一段时间里面一直在使用Vue配合 lib-flexible和px2rem-loader配合做移动端的网页适配.秉着求知的思想,今天决定对他的原理进行分析.目前网上比较主流使用的就是淘宝方 ...
- E面波导和H面波导的问题
我感觉与窄壁平行是E面,反之为H面.通常E面(窄面)是指与电场方向平行的方向图切面(窄面):H面(宽面)是指与磁场方向平行的方向图切面(宽面).E面的意思是... ElevationH面的意思是... ...
- 100个Shell脚本——【脚本2】截取字符串
[脚本2]截取字符串 一.脚本 现有一个字符串如下: http://www.aaa.com/root/123.htm 请根据以下要求截取出字符串中的字符: 1.取出www.aaa.com/root/1 ...
- mysql报错max_connections错误
SELECT @@MAX_CONNECTIONS AS 'Max Connections';set GLOBAL max_connections=10000; show status like '%t ...
- java加密方式
加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容.大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些 ...