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

参看: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++设计模式概述之状态的更多相关文章

  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. C/C++ Qt 数据库与TreeView组件绑定

    在上一篇博文<C/C++ Qt 数据库QSql增删改查组件应用>介绍了Qt中如何使用SQL操作函数,并实现了对数据库的增删改查等基本功能,从本篇开始将实现数据库与View组件的绑定,通过数 ...

  2. 学习Java的第四天

    一.今日收获 1.java完全手册的第一章 2.   1.6节了解了怎么样用记事本开发java程序 与用Eclipse开发 2.完成了对应例题 二.今日难题 1.一些用法容易与c++的混淆 2.语句还 ...

  3. A Child's History of England.3

    So, Julius Caesar came sailing over to this Island of ours, with eighty vessels and twelve thousand ...

  4. absent, absolute

    absent 1. A teacher asked in a class who killed Abraham Lincoln. A blonde said "It wasn't me, I ...

  5. UBI 文件系统之分区挂载

    Linux 系统中有关mtd和ubi的接口:(1) cat /proc/mtd:可以看到当前系统的各个mtd情况,(2) cat /proc/partitions: 分区信息,有上面的类似(3) ca ...

  6. Hive(二)【数据类型、类型转换】

    目录 一.基本数据类型 案例实操 二.集合数据类型 案例实操 Map类型 三.类型转换 1.隐式类型转换 2.显示(强制)类型转换 一.基本数据类型 HIVE MySQL JAVA 长度 例子 TIN ...

  7. webpack打包报错 ERROR in ./js/ww.js from UglifyJs Unexpected token keyword «function», expected punc «,» [src/page/ww/view/xx/xx.vue:119,0][./js/ww.js:55218,17]

    找了好多解决办法 你可以试着将babel-loader的exclude注释掉,然后看能否打包成功.如果可以,那就是这个问题.你只需要在vue.config.js中配置transpileDependen ...

  8. Apache2配置文件解读

    每次碰到都不知道具体的作用,所以来分析一下 配置文件结构 apache2在启动的时候自动读取/etc/apache2/apache2.conf文件的配置信息,不同的配置项按功能分布在不同的文件中,然后 ...

  9. Dubbo应用到web工程

    一.创建提供者03-provider-web (1) 创建工程 创建Maven的web工程,然后创建实现类. (2) 导入依赖 Spring的版本为4.3.16 需要的依赖有: dubbo2.7.0版 ...

  10. Vue重要知识

    Event Bus 总线 Vue中的EventBus是一种发布订阅模式的实践,适用于跨组件简单通信. Vuex也可以用来组件中进行通信,更适用于多组件高频率通信. 使用方式: 1.把Bus注入到Vue ...