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

参看: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. HDU 6755 - Fibonacci Sum(二项式定理+推式子)

    题面传送门 其实是一道还好的题罢,虽然做了我 2147483647(bushi,其实是 1.5h),估计也只是因为 HDU 不支持数据下载所以错误总 debug 出来 首先看到 \(10^9+9\) ...

  2. Java设计模式之(十四)——策略模式

    1.什么是策略模式? Define a family of algorithms, encapsulate each one, and make them interchangeable. Strat ...

  3. Discontinuous Galerkin method for steady transport problem

    下面讨论如何使用 Discontinuous Galerkin 求解恒定对流问题. 1.简介 恒定状态对流方程 \[\begin{equation} a\cdot \nabla \mathbf{u} ...

  4. Oracle-distinct()用法、count(distinct( 字段A || 字段B))是什么意思?distinct多个字段

    0.distinct用法 在oracle中distinct的使用主要是在查询中去除重复出现的数据 直接在字段前加distinct关键字即可,如:select distinct 名字 from tabl ...

  5. lua5.4 beta中的to-be-closed变量的用法

    对应目前最新lua5.4 beta版本:2019-10-09发布 这个功能之前修改过两次语法,当前的语法不出意外将会是最终决定了,目前还没有最新的中文资料,所以我来这里发一下. 先介绍下这个功能: 被 ...

  6. Redis | 第9章 Lua 脚本与排序《Redis设计与实现》

    目录 前言 1. Lua 脚本 1.1 Redis 创建并修改 Lua 环境的步骤 1.2 Lua 环境协作组件 1.3 EVAL 命令的实现 1.4 EVALSHA 命令的实现 1.5 脚本管理命令 ...

  7. 学习java的第五天

    一.今日收获 1.java程序设计完全手册第一章节的小总结 2.完成了部分例题验证解答. 二.今日难题 1.java语言与c++语言的不同点. 2.有例题验证不出来 三.明日目标 1.复习java程序 ...

  8. 学习java 7.2

    学习内容:案例一:斐波那契数列从1开始作为第一个数,求第20个数 public class Test { public static void main(String[ ] args){ int[ ] ...

  9. day09 文件属性

    day09 文件属性 昨日回顾 yum底层原理: 第一步:执行yum install nginx安装命令 第二步:yum去/etc/yum.repos.d这个目录中 第三步:根据/etc/yum/re ...

  10. 【原创】Altium生成Gerber时跳出The Film is too small for this PCB的解决办法

    在用altium Designer画板子的时候,要生成gerber文件的时候,会出错,出现这样的提示框:"The Film is too small for this PCB" 原 ...