状态模式

模式定义

状态模式(state),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

模式动机

  • 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
  • 当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式了。

UML类图

源码实现

  • state.h
#include <string>
class People;class State
{
public:State(std::string context);virtual ~State();virtual void Handle(People* people) = 0;std::string Content();
protected:std::string m_Content;private:int     m_Time;
};
  • people.h
#include "state.h"class People
{
public:People(State* state);void ChangeState(State* state);void Show();void SetTime(int time);int Time();
private:int     m_Now;State*    m_State;
};
  • people.cpp
#include <iostream>
#include "people.h"People::People(State* state):m_State(state)
{}void People::ChangeState(State* state)
{m_State = state;
}void People::Show()
{std::cout << "来吧,展示!" << std::endl;std::cout << "当前状态:" << m_State->Content() << std::endl;
}void People::SetTime(int time)
{m_Now = time;m_State->Handle(this);
}int People::Time()
{return m_Now;
}
  • lifestate.h
#include "state.h"class LifeState : public State
{
public:LifeState(std::string content = "生活状态");void Handle(People *people) override;
};
  • lifestate.cpp
#include "lifestate.h"
#include "workstate.h"
#include "people.h"LifeState::LifeState(std::string content):State(content)
{}void LifeState::Handle(People *people)
{int time = people->Time();if(time > 9 && time < 18)people->ChangeState(new WorkState());
}
  • main.cpp
#include <iostream>
#include <memory>
#include "people.h"
#include "workstate.h"
#include "playstate.h"
#include "lifestate.h"using namespace std;int main()
{std::shared_ptr<State> state1 = std::make_shared<WorkState>();People p(state1.get());p.Show();p.SetTime(9);p.Show();p.SetTime(11);p.Show();p.SetTime(13);p.Show();p.SetTime(20);p.Show();p.SetTime(22);p.Show();return 0;
}
  • 运行结果

来吧,展示!

当前状态:工作状态

来吧,展示!

当前状态:工作状态

来吧,展示!

当前状态:工作状态

来吧,展示!

当前状态:玩儿乐状态

来吧,展示!

当前状态:生活状态

优点

模式的优点

  • 将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

    将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易的增加新的状态和转换。

  • 消除庞大的条件分支语句。

  • 状态模式通过把各种状态转移逻辑分布到state的子类之间,来减少相互之间的依赖。

缺点

模式的缺点

  • 每个子状态跳转到另外一个子状态是固定的,不能够灵活设置下一个状态,也就是说状态之间装换最好是一对一的,否则就又会出现一个庞大的分支语句。从这点上来看还有点像职责链模式。

状态模式(c++实现)相关推荐

  1. JS设计模式(13)状态模式

    什么是状态模式? 定义:将事物内部的每个状态分别封装成类,内部状态改变会产生不同行为. 主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为. 何时使用:代码中包含大 ...

  2. 设计模式之状态模式(State)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  3. 设计模式:状态模式(State Pattern)

    作者:Wang Juqiang  创建于:2012-07-16 出处:http://www.cnblogs.com/wangjq/archive/2012/07/16/2593485.html 收录于 ...

  4. else 策略模式去掉if_设计模式(三)——简单的状态模式代替if-else

    博主将会针对Java面试题写一组文章,包括J2ee,SQL,主流Web框架,中间件等面试过程中面试官经常问的问题,欢迎大家关注.一起学习,一起成长. 前言 大多数开发人员现在还在使用if else的过 ...

  5. 【设计模式】 模式PK:策略模式VS状态模式

    1.概述 行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下. 策略模式(左)和状态模式(右)的通用类图. 两个类图非常相似,都是通过Cont ...

  6. Python设计模式-状态模式

    Python设计模式-状态模式 代码基于3.5.2,代码如下; #coding:utf-8 #状态模式class state():def writeProgram(self,work):raise N ...

  7. 18State(状态)模式

    技术交流QQ群:1027579432,欢迎你的加入! 1.状态变化模式 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?状态变化模式为这一问题提供 ...

  8. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

  9. 状态模式(State)

    一.概念: 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类.[DP] 二.作用: 状态模式的主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况. 吧状态的判断逻辑 ...

  10. HeadFirst设计模式篇十:状态模式

    2019独角兽企业重金招聘Python工程师标准>>> 问题引入: 糖果机有四个状态,在不同的动作下状态会发生转变.后续可能会添加其他状态,例如转动曲柄,有可能调出两颗弹. 设计方案 ...

最新文章

  1. js中变量和jsp中java代码中变量互相访问解决方案
  2. 改进的SVN的Commit权限控制
  3. html5和极速模式,浅谈360浏览器6.0版本极速模式与兼容模式_蓝戒的博客
  4. python里进度条编程_Python实现控制台中的进度条
  5. ubuntu 外置硬盘安装
  6. 连接动态链接库时找不到链接库的解决办法
  7. Android 视频直播 ( 从快播到直播,从高清到无码 )十年视频开发项目
  8. 第3章基本程序设计结构(java知识点笔记)
  9. 全球与中国药用玻璃容器市场深度研究分析报告
  10. 2021-3-18大学化学无机原理(3)热力学能与热力学第一定律
  11. 解压rar/zip工具类
  12. 【Cocos Creator 实战教程(4)】——黄金矿工(上)(节点动作、碰撞体相关)
  13. 极点五笔常用特殊符号编码
  14. TIOBE12月编程语言排行榜出炉!Java第一,有人要失业?
  15. sco unix 管理员速成
  16. ipconfig/all详解
  17. 诚邀参会|2022第十届上海国际生物发酵产品与技术装备展览会
  18. WebGL 手撸3d贺卡+小草飘动滤镜
  19. 计算机实验报告心得体会100字左右,[物理实验心得体会] 物理实验心得100字
  20. 2019学硕计算机分数,2019计算机考研408分数要求以及复习攻略?

热门文章

  1. C语言不用循环不用递归打印0-999的小程序,你看懂了吗?
  2. .NET分布式事务处理
  3. 【数据结构与算法】之深入解析“组合总和III”的求解思路与算法示例
  4. 17. Letter Combinations of a Phone Number 电话号码的字母组合
  5. 10.1.1 head标签
  6. 2019第十届蓝桥杯C/C++ A组省赛 —— 第三题: 最大降雨量
  7. 2019年第十届蓝桥杯 - 省赛 - C/C++大学B组 - A. 组队
  8. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1114:白细胞计数
  9. 【MFC】MFC消息处理和映射
  10. 【Java】Java枚举类型示例