1定义

当一个状态的内在状态改变时允许其行为改变,这个对象看起来像改变了其类

2类图

角色分析

State抽象状态角色,接口或者抽象类,负责状态定义,并且封装环境角色以实现状态切换

ConcreteState具体状态角色,完成两个职责:本状态行为管理以及趋向状态处理--==本状态要做的事和本状态如何过度到其他状态

Context环境角色,定义客户端需要的接口,并且负责具体状态的切换

实现

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. //前项声明
  5. class Context;
  6. //抽象状态类定义
  7. class State
  8. {
  9. protected:
  10. State(){}
  11. public:
  12. virtual~State() =
  13. {};
  14. void setContext(Context *x)
  15. {
  16. _context = x;
  17. }
  18. virtual void handler1() = ;
  19. virtual void handler2() = ;
  20. private:
  21. Context *_context;
  22. };
  23.  
  24. //具体状态定义
  25. class ConcreteState1 :public State
  26. {
  27. public:
  28. ConcreteState1(){}
  29. ~ConcreteState1(){}
  30.  
  31. void handler1()
  32. {
  33. cout << "ConcreteState1::handler1" << endl;
  34. }
  35. void handler2()
  36. {
  37. cout << "ConcreteState1::handler2" << endl;
  38. }
  39. private:
  40.  
  41. };
  42.  
  43. //具体状态定义
  44. class ConcreteState2 :public State
  45. {
  46. public:
  47. ConcreteState2(){}
  48. ~ConcreteState2(){}
  49.  
  50. void handler1()
  51. {
  52. cout << "ConcreteState2::handler1" << endl;
  53. }
  54. void handler2()
  55. {
  56. cout << "ConcreteState2::handler2" << endl;
  57. }
  58. private:
  59.  
  60. };
  61.  
  62. //环境类
  63. class Context
  64. {
  65. public:
  66. Context()
  67. :Sta1(new ConcreteState1)
  68. ,Sta2(new ConcreteState2)
  69. {}
  70. State* getCurrentState()
  71. {
  72. return CurrentState;
  73. }
  74. void SetCurrentState(State* s)
  75. {
  76. CurrentState = s;
  77. CurrentState->setContext(this);
  78. }
  79. void handler1()
  80. {
  81. CurrentState->handler1();
  82. }
  83. void handler2()
  84. {
  85. CurrentState->handler2();
  86. }
  87. ~Context(){}
  88. private:
  89. //当前状态则是所有状态中的一种
  90. State *CurrentState;
  91. //所有状态应当定义为static比较合适
  92. State *Sta1;
  93. State *Sta2;
  94. };
  1. void TestState()
  2. {
  3. Context * context = new Context();
  4. context->SetCurrentState(new ConcreteState1());
  5.  
  6. context->handler1();
  7. context->handler2();
  8. context->SetCurrentState(new ConcreteState2());
  9. context->handler1();
  10. context->handler2();
  11. }
  1.  
  1.  

3应用

①优点

状态模式隐藏了状态的 变化过程,他的切换引起了行为的变化。我们只看到行为变化,而没有状态变化

结构清晰,避免过多switch或者if语句的使用

体现开闭原则和单一职责原则,每个状态都是一个子类

封装性良好,状态变化在内部体现,外界调用不知道这一点

②缺点

子类越多会带来类膨胀的问题

4使用场景

行为随着状态改变而改变

条件分之判断语句的替代者

5注意事项

状态模式适用于当某个对象在他的状态发生变化时,他的行为也随之变化,也就是行为受状态约束的情况下使用状态模式,而且使用对象时状态不超过5个

6最佳实践

TCP三个状态切换:等待状态,连接状态,断开状态。

工作流开发:状态机管理。

{

设计模式--状态模式C++实现的更多相关文章

  1. 14. 星际争霸之php设计模式--状态模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. [Head First设计模式]生活中学设计模式——状态模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  3. JAVA 设计模式 状态模式

    用途 状态模式 (State) 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式是一种行为型模式. 结构

  4. 深入浅出设计模式——状态模式(State Pattern)

    模式动机 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的 (stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的.当一个这样的 ...

  5. C++设计模式——状态模式

    前言 在实际开发中,我们经常会遇到这种情况:一个对象有多种状态,在每一个状态下,都会有不同的行为.那么在代码中我们经常是这样实现的. typedef enum tagState { state, st ...

  6. C#设计模式--状态模式

    设计模式: 状态模式(State Pattern) 简单介绍: 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式. 在状态模式中,我们创建表示 ...

  7. Java设计模式—状态模式

    状态模式又是一个比较难的设计模式 定义如下: 当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类. 个人理解:通俗的讲,状态模式就是状态的改变引起了行为的改变,但是,我们只能看到行为的 ...

  8. 设计模式-状态模式(State Pattern)

    本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 状态模式简介 状态模式允许一个对象在其内部状态改变的时候改变它的行为,他的内部会存着好几种状态, ...

  9. JavaScript设计模式——状态模式

    状态和行为: 所谓对象的状态,通常指的就是对象实例的属性的值:而行为指的就是对象的功能,再具体点说,行为大多可以对应到方法上. 状态模式的功能就是分离状态的行为,通过维护状态的变化,来调用不同状态对应 ...

  10. C#设计模式——状态模式(State Pattern)

    一.概述在面向对象软件设计时,常常碰到某一个对象由于状态的不同而有不同的行为.如果用if else或是switch case等方法处理,对象操作及对象的状态就耦合在一起,碰到复杂的情况就会造成代码结构 ...

随机推荐

  1. PAT 1052 Linked List Sorting [一般]

    1052 Linked List Sorting (25 分) A linked list consists of a series of structures, which are not nece ...

  2. boost单元测试框架

    头文件: #include <boost/test/unit_test.hpp> 编译加:-lboost_unit_test_framework 单元测试: 需要定义BOOST_TEST_ ...

  3. Flask之初体验

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  4. wget 用法

    wget -r -p -np -k http://xxx.com/xxx

  5. 基于EasyUI 快速搭建权限管理平台

    前言: 一.用户角色权限设计思路: <1>不同职责的人员,对于系统操作的权限应该是不同;<2>可以对“组”进行权限分配;<3>权限管理系统应该是可扩展的;<4 ...

  6. ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph (上下界网络流)

    正解: #include <bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; const int MAXN=1 ...

  7. python在CentOS 7中的安装

    CentOS 7 中默认安装了python2.7.5,可能部分开发人员需要使用python3系列的产品,因为版本不“向下”兼容,诸如print函数,因此需要对于不同的项目进行python版本之间的切换 ...

  8. adb常用操作

    1.安装程序 adb -s serialno install -r path 2.切换电源 adb -s serialno shell input keyevent 26 3.主页键 adb -s s ...

  9. Swoole学习(六)Swoole之定时器的创建与清除

    环境:Centos6.4,PHP环境:PHP7,Swoole2.1(在指定的时间后执行函数,需要1.7.7或更高版本) <?php //----------------------------- ...

  10. 无线网卡在 MAC 系统下的安装与使用过程

    MAC系统安装netgear无线网卡的方法: 1)去网件官网下载相应的驱动软件 2)单击页面左侧的“Version 1.0.0.0”进入下载页面如下图 3)选择对应您系统版本的驱动程序,按右键保存到计 ...