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

参看: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、结果:

最新文章

  1. VS2012 还原默认设置
  2. JQuery学习思维导图版
  3. VM安装linux
  4. Android activity之间传值关键性代码
  5. [bzoj 3687]简单题 bitset的运用
  6. mysql之select(一)
  7. MariaDB10.2.X-新特性1-支持分析函数
  8. 【dynamic】简化反射简单尝试
  9. Counting - SGU 117(快速幂)
  10. mysql表结构设计
  11. Android开源项目(一)
  12. C语言之switch
  13. netstat 查看连接数
  14. Ubuntu 简单安装 Docker
  15. [国嵌笔记][008-009][远程登录Linux]
  16. CentOS7下安装Redis5.0.2
  17. 重启iis命令
  18. Oarcle 入门之 order by 关键字
  19. TF(3): 安装部署_Windows
  20. [学习笔记]prufer序列

热门文章

  1. python18内存管理
  2. SourceTree使用图解-转
  3. rabbit mq的一个实例,异步功能
  4. addict, address, adequate
  5. 一起手写吧!ES5和ES6的继承机制!
  6. Oracle中常用的系统函数
  7. iOS调用系统电话、浏览器、地图、邮件等
  8. ganglia -api
  9. my37_MGR流控对数据库性能的影响以及MGR与主从的性能对比
  10. 【Java 与数据库】How to Timeout JDBC Queries