以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码

//Context.h

  1. #pragma once
  2. class State;
  3. class Context
  4. {
  5. public:
  6. Context();
  7. Context(State* st);
  8. virtual ~Context();
  9. void OperationInference();
  10. void OperationChangeState();
  11. protected:
  12. private:
  13. friend class State;
  14. bool changeState(State* st);
  15. State* _state;
  16. };

//Context.cpp

  1. #include"Context.h"
  2. #include"State.h"
  3.  
  4. Context::Context() {}
  5. Context::Context(State* st)
  6. {
  7. this->_state = st;
  8. }
  9. Context::~Context()
  10. {
  11. delete _state;
  12. }
  13. void Context::OperationInference()
  14. {
  15. _state->OperationInference(this);
  16. }
  17. bool Context::changeState(State* state)
  18. {
  19. this->_state = state;
  20. return true;
  21. }
  22. void Context::OperationChangeState()
  23. {
  24. _state->OperationChangemode(this);
  25. }

//State.h

  1. #pragma once
  2. class Context;
  3. class State
  4. {
  5. public:
  6. State();
  7. virtual ~State();
  8. virtual void OperationInference(Context*) = ;
  9. virtual void OperationChangemode(Context*) = ;
  10. protected:
  11. bool changeState(Context* con, State* st);
  12. private:
  13. };
  14.  
  15. class ConcreateStateA:public State
  16. {
  17. public:
  18. ConcreateStateA();
  19. virtual ~ConcreateStateA();
  20. virtual void OperationInference(Context*);
  21. virtual void OperationChangemode(Context*);
  22. private:
  23. protected:
  24. };
  25.  
  26. class ConcreateStateB :public State
  27. {
  28. public:
  29. ConcreateStateB();
  30. virtual ~ConcreateStateB();
  31. virtual void OperationInference(Context*);
  32. virtual void OperationChangemode(Context*);
  33. private:
  34. protected:
  35. };

//State.cpp

  1. #include"State.h"
  2. #include"context.h"
  3. #include<iostream>
  4. State::State(){}
  5. State::~State(){}
  6. void State::OperationInference(Context* con)
  7. {
  8. std::cout << "State::..." << std::endl;
  9. }
  10. bool State::changeState(Context* con, State* st)
  11. {
  12. con->changeState(st);
  13. return true;
  14. }
  15. void State::OperationChangemode(Context* con)
  16. {
  17.  
  18. }
  19. ConcreateStateA::ConcreateStateA()
  20. {
  21.  
  22. }
  23. ConcreateStateA::~ConcreateStateA()
  24. {}
  25. void ConcreateStateA::OperationInference(Context* con)
  26. {
  27. std::cout << "OperationInference ConcreateStateA" << std::endl;
  28. }
  29. void ConcreateStateA::OperationChangemode(Context* con)
  30. {
  31. OperationInference(con);
  32. this->changeState(con, new ConcreateStateB());
  33. }
  34. ConcreateStateB::ConcreateStateB(){}
  35. ConcreateStateB::~ConcreateStateB(){}
  36. void ConcreateStateB::OperationInference(Context* con)
  37. {
  38. std::cout << "OperationInference ConcreateStateB" << std::endl;
  39. }
  40. void ConcreateStateB::OperationChangemode(Context* con)
  41. {
  42. OperationInference(con);
  43. this->changeState(con, new ConcreateStateA());
  44. }

//main.cpp

  1. #include"Context.h"
  2. #include"State.h"
  3. #include<iostream>
  4. int main(int args, char* argv)
  5. {
  6. State* st = new ConcreateStateA();
  7. Context* con = new Context(st);
  8. con->OperationChangeState();
  9. con->OperationChangeState();
  10. con->OperationChangeState();
  11. if (!con)
  12. delete con;
  13. if (NULL != st)
  14. st = NULL;
  15. return ;
  16.  
  17. }

设计模式-State(行为模式)-很好的实现了对象的状态逻辑与动作实现的分类,状态逻辑在State的派生类实现,动作可以放在Context类中实现。的更多相关文章

  1. C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi

    C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...

  2. 游戏开发设计模式之原型模式 & unity3d JSON的使用(unity3d 示例实现)

    命令模式:游戏开发设计模式之命令模式(unity3d 示例实现) 对象池模式:游戏开发设计模式之对象池模式(unity3d 示例实现) 实现原型模式 原型模式带来的好处就是,想要构建生成任意独特对象的 ...

  3. 设计模式之组合模式(Composite Pattern)

    一.什么是组合模式? 组合模式提供了一种层级结构,并允许我们忽略对象与对象集合之间的差别 调用者并不知道手里的东西是一个对象还是一组对象,不过没关系,在组合模式中,调用者本来就不需要知道这些 二.举个 ...

  4. 转:.net设计模式之工厂模式

    原文:http://terrylee.cnblogs.com/archive/2006/01/04/310716.html 概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对 ...

  5. python设计模式之解释器模式

    python设计模式之解释器模式 对每个应用来说,至少有以下两种不同的用户分类. [ ] 基本用户:这类用户只希望能够凭直觉使用应用.他们不喜欢花太多时间配置或学习应用的内部.对他们来说,基本的用法就 ...

  6. Java设计模式—中介者模式

    中介者模式是一种并不常用的模式,在此简单阐述阐述. 定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 类型:行为类模式 ...

  7. 设计模式:状态(State)模式

    设计模式:状态(State)模式 一.前言     状态模式在某些场合中使用是非常方便的,什么叫做状态,如果大家学过<编译原理>就会明白DFA M和NFA M,在确定有限状态机和非确定有限 ...

  8. 设计模式之策略模式和状态模式(strategy pattern & state pattern)

    本文来讲解一下两个结构比较相似的行为设计模式:策略模式和状态模式.两者单独的理解和学习都是比较直观简单的,但是实际使用的时候却并不好实践,算是易学难用的设计模式吧.这也是把两者放在一起介绍的原因,经过 ...

  9. C#设计模式(19)——状态者模式(State Pattern)

    一.引言 在上一篇文章介绍到可以使用状态者模式和观察者模式来解决中介者模式存在的问题,在本文中将首先通过一个银行账户的例子来解释状态者模式,通过这个例子使大家可以对状态者模式有一个清楚的认识,接着,再 ...

随机推荐

  1. c# 保留2位小数 整数时无小数

    对数值保存两位小数,有时是整数时,不需要显示两位小数.例如值为:1.32 保留两位,结果是1.32,值为:2,结果有两种显示,2和2.00 /// <summary> /// 金额 /// ...

  2. TSC打印机防重码在线检测系统

    条码标签作为产品的一个身份标识,被应用得越来越普及,但随着使用量的增大,在打印条码流水号的过程中,偶尔会出现打印重复号码的标签出现,这样对产品生产及管理过程中会产生极大的混乱,会收到严重的客诉及返工, ...

  3. This system is not registered with ULN

    [root@DBDATA yum.repos.d]# yum makecacheLoaded plugins: aliases, changelog, downloadonly, fastestmir ...

  4. django之跨站请求伪造csrf

    目录 跨站请求伪造 csrf 钓鱼网站 模拟实现 针对form表单 ajax请求 csrf相关的两个装饰器 跨站请求伪造 csrf 钓鱼网站 就类似于你搭建了一个跟银行一模一样的web页面 , 用户在 ...

  5. Node.js上传文件出现Unexpected field

    上传文件时,input框的name值要与node接口中single(' ')中的参数一致,否则会报"意外字段的错" 前端用的layui 后端node接口

  6. 线程队列queue的使用

    其实线程队列queue跟进程Queue的用法一样. 一.先进先出 import queue q = queue.Queue() q.put('kobe') q.put('cxk') print(q.g ...

  7. SpringCloud的入门学习之深入理解Eureka注册中心

    1.Eureka 注册中心三种角色. 答:a.Eureka Server,注册中心,通过 Register.Get.Renew 等接口提供服务的注册和发现. b.Application Service ...

  8. SpringBoot配置文件yml ScannerException: while scanning an alias *

    在使用yml编写配置我呢见 management: endpoints: web: base-path: /actuator jmx: exposure: include: * 报了如下错误 解决方案 ...

  9. C# 调用POST请求

    public static void PostUrl_Ex(string url, string postData) { try { //对于提交内容中的中文使用UrlEncode方式编码 发送 // ...

  10. jquery.wordexport.js打印echarts.js画出的柱状图

    jquery.wordexport.js打印echarts.js画出的柱状图. echarts画出的图是不能直接打印出来的(echarts的柱状图是用canvas画出来的),而jquery.worde ...