当前位置: 首页 > news >正文

状态模式 行为型模式之六

1.定义

允许一个对象在其对象内部状态改变时改变它的行为。

2.组成结构

  1. Context:定义客户感兴趣的接口;维护一个ConcreteState子类的实例,这个实例定义当前的状态。
  2. State:定义一个接口来封装Context的与特定状态相关的行为。
  3. ConcreteState:每个ConcreteState实现一个与Context的一个状态相关的行为。

3.应用场景

        状态模式是用途非常广泛的模式,所有使用到有限状态机(FSM)的地方都可以使用该模式。当然,如果不使用状态模式的话,switch/case语句也可以胜任简单的状态机,但对于大型的状态机具有大量的状态和事件,维护冗长、嵌套的switch/case语句是非常困难和容易出错的,而且switch/case语句通常都没有很好地分离状态机的逻辑和要执行的操作。另外一种选择状态转移表(WIS20中采用),它更容易维护,如果要增加新的状态转移,只要向表中增加一行就可以了,而且可以在运行时动态改变状态机的逻辑,还可以创建多个不同的状态转移表,在运行时动态地选择解释执行哪一个,但缺点是要编写大量的代码去支持状态转移表,而且需要查询和解释执行,速度较慢

        状态模式是最灵活、最高效的选择,因为它彻底分离了状态机的逻辑和动作行为,二者可以独立变化、互不影响,而且容易扩展,同时效率很高。当然,它也有缺点,就是编写State的派生类是一项乏味的工作,同时状态逻辑分散,无法在一个地方看到整个状态机的逻辑。为了克服这两个缺点,可以用一个文本描述状态转移表,然后用适当的Software Factory工具把它变成状态模式所必需的类的代码。

        GUI是典型的状态应用。哪些菜单项和按钮是Disabled,哪个窗口应该激活,焦点应放在哪里,等等,都和状态有关。如果不把这些要素组织成为一个单一的、集中的状态机控制结构,那将是一场噩梦。

4.示例代码

#include <iostream>
#include <list>
using namespace std;class State;
class ConcreteStateA;
class ConcreteStateB;class Context
{
public:State *state;Context(State *_state):state(_state){}void Request();
};class State
{
public:string name;virtual void Handle(Context *c) = 0;virtual ~State(){cout << "delete :" << this->name << endl;};
};class ConcreteStateA:public State
{
public:ConcreteStateA(){name = "状态A";}virtual void Handle(Context *c);
};class ConcreteStateB:public State
{
public:ConcreteStateB(){name = "状态B";}virtual void Handle(Context *c);
};
void ConcreteStateA::Handle(Context *c){delete c->state;c->state = new ConcreteStateB();
}
void ConcreteStateB::Handle(Context *c){delete c->state;c->state = new ConcreteStateA();
}
void Context::Request(){cout << "当前状态:" << state->name << endl;this->state->Handle(this);cout << "切换后状态:" << state->name << endl << endl;
}
int main(void)
{Context *c = new Context(new ConcreteStateA());c->Request();c->Request();c->Request();c->Request();return 0;
}

5.引用

https://blog.csdn.net/qq_40178082/article/details/133039091

 

相关文章:

状态模式 行为型模式之六

1.定义 允许一个对象在其对象内部状态改变时改变它的行为。 2.组成结构 Context&#xff1a;定义客户感兴趣的接口&#xff1b;维护一个ConcreteState子类的实例&#xff0c;这个实例定义当前的状态。State&#xff1a;定义一个接口来封装Context的与特定状态相关的行为。Co…...

JAVA NIO深入剖析

4.1 Java NIO 基本介绍 Java NIO(New IO)也有人称之为 java non-blocking IO是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方…...

企业电子招投标系统源码之电子招投标系统建设的重点和未来趋势

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…...

基于正点原子alpha开发板的第三篇系统移植

系统移植的三大步骤如下&#xff1a; 系统uboot移植系统linux移植系统rootfs制作 一言难尽&#xff0c;踩了不少坑&#xff0c;当时只是想学习驱动开发&#xff0c;发现必须要将第三篇系统移植弄好才可以学习后面驱动&#xff0c;现将移植好的文件分享出来&#xff1a; 仓库&…...

数据结构与算法设计分析——贪心算法的应用

目录 一、贪心算法的定义二、贪心算法的基本步骤三、贪心算法的性质&#xff08;一&#xff09;最优子结构性质&#xff08;二&#xff09;贪心选择性质 四、贪心算法的应用&#xff08;一&#xff09;哈夫曼树——哈夫曼编码&#xff08;二&#xff09;图的应用——求最小生成…...

Leetcode 2895. Minimum Processing Time

Leetcode 2895. Minimum Processing Time 1. 解题思路2. 代码实现 题目链接&#xff1a;2895. Minimum Processing Time 1. 解题思路 这一题整体上来说其实没啥难度&#xff0c;就是一个greedy算法&#xff0c;只需要想明白耗时长的任务一定要优先执行&#xff0c;不存在某个…...

学信息系统项目管理师第4版系列21_范围管理

1. 产品范围 1.1. 某项产品、服务或成果所具有的特征和功能 1.2. 产品范围的完成情况是根据产品需求来衡量的 1.3. “需求”是指根据特定协议或其他强制性规范&#xff0c;产品、服务或成果必须具备的条件或能力 2. 项目范围 2.1. 包括产品范围&#xff0c;是为交付具有规…...

threejs 透明贴图,模型透明,白边

问题 使用Threejs加载模型时&#xff0c;模型出现了上面的问题。模型边缘部分白边&#xff0c;或者模型出现透明问题。 原因 出现这种问题是模型制作时使用了透明贴图。threejs无法直接处理贴图。 解决 场景一 模型有多个贴图时&#xff08;一个透贴和其他贴图&#xff0…...

CCF CSP认证 历年题目自练Day21

题目一 试题编号&#xff1a; 201909-1 试题名称&#xff1a; 小明种苹果 时间限制&#xff1a; 2.0s 内存限制&#xff1a; 512.0MB 题目分析&#xff08;个人理解&#xff09; 先看输入&#xff0c;第一行输入苹果的棵树n和每一次掉的苹果数m还是先如何存的问题&#xf…...

【Python_PySide2学习笔记(十六)】多行文本框QPlainTextEdit类的的基本用法

多行文本框QPlainTextEdit类的的基本用法 前言正文1、创建多行文本框2、多行文本框获取文本3、多行文本框获取选中文本4、多行文本框设置提示5、多行文本框设置文本6、多行文本框在末尾添加文本7、多行文本框在光标处插入文本8、多行文本框清空文本9、多行文本框拷贝文本到剪贴…...

linux上negix部署静态页面

1.看配置文件 进入cndf.d 这里的是配置部署项目中的文件 进入一个查看下 上面的是服务的域名&#xff0c;服务是http://test.fun-med.cn/#/&#xff0c;后面加服务名&#xff08;你的前端&#xff09; 2.看下页面位置 和上面的路径要匹配...

41.说说Promise自身的静态方法

41.说说Promise自身的静态方法 Promise.all &#xff08;有一个失败就失败&#xff0c;所有的都成功就成功&#xff09;Promise.race &#xff08;有一个成功就成功&#xff0c;有一个失败就失败&#xff09;Promise.allSettled &#xff08;所有的异步操作执行完毕之后&#…...

通讯网关软件019——利用CommGate X2OPCUA实现OPC UA访问Oracle服务器

本文介绍利用CommGate X2OPCUA实现OPC UA访问ORACLE数据库。CommGate X2OPCUA是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现上位机通过OPC UA来获取ORACLE数据库的数据。 【解决方案】…...

【机器学习】svm

参考 sklearn中SVC中的参数说明与常用函数_sklearn svc参数-CSDN博客https://blog.csdn.net/transformed/article/details/90437821 参考PYthon 教你怎么选择SVM的核函数kernel及案例分析_clfsvm.svc(kernel)-CSDN博客https://blog.csdn.net/c1z2w3456789/article/details/10…...

基于SSM+Vue的学习交流论坛的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

开发与运营:“开发”和“运营”角色有何不同和重叠?

开发和运营是促进软件系统交付的两种角色。大多数大规模构建软件的组织都会雇用这两个学科的人员。不过,开发和运维并不是完全孤立的。团队重叠并实现更高的吞吐量是很常见的。 在本文中,您将学习区分开发人员和操作人员之间的主要区别,以及它们重叠的方式。尽管有将两者结合…...

关于GD32引脚PA13、PA15、PB3、PB4配置为普通引脚的问题

关于GD32引脚PA13、PA15、PB3、PB4配置为普通引脚的问题 在实际开发中&#xff0c;经常会遇到引脚资源受限需要将一些具有特定功能的引脚配置为普通引脚或其他引脚功能使用的情况。 博主之前遇到过类似的情况&#xff0c;都正常解决了。但偶尔也会出现在配置引脚时少了一些配…...

JS-Dom转为图片,并放入pdf中进行下载

1、将dom转换为图片 这里我们使用html2canvas工具插件先将dom转为canvas元素然后canvas拥有一个方法可以将绘制出来的图形转为url然后下载即可注意&#xff1a;如果元素使用了渐变背景并透明的话&#xff0c;生成的图片可能会有点问题。我下面这个案例使用了渐变背景实现元素对…...

Python 无废话-办公自动化Excel格式美化

设置字体 在使用openpyxl 处理excel 设置格式&#xff0c;需要导入Font类&#xff0c;设置Font初始化参数&#xff0c;常见参数如下&#xff1a; 关键字参数 数据类型 描述 name 字符串 字体名称&#xff0c;如Calibri或Times New Roman size 整型 大小点数 bold …...

Python视频剪辑-Moviepy音频效果afx方法

随着多媒体内容在日常生活和工作中的广泛应用,音频处理成为了一个越来越重要的技能。无论是在游戏开发、音乐制作,还是在各种应用和网站中,高质量的音频处理都能极大地提升用户体验。然而音频处理看似复杂,实则不必如此。其实只需要掌握一些基础的概念和技巧,就能够完成大…...

STM32F103C8T6+TJA1042+UTA0403:手把手教你搭建CAN通讯测试环境(附完整接线图)

STM32F103C8T6TJA1042UTA0403&#xff1a;从零构建工业级CAN总线测试平台 第一次接触CAN总线的工程师往往会被物理层连接的各种细节困扰——为什么收发器需要独立供电&#xff1f;STB引脚悬空会导致什么后果&#xff1f;如何避免共模干扰&#xff1f;本文将用实验室级精度拆解S…...

QGIS中高效集成天地图:从注册到加载的完整指南

1. 天地图与QGIS的完美结合 第一次接触天地图是在一个城市规划项目里&#xff0c;当时需要高精度的底图作为参考。天地图作为国内权威的地理信息服务&#xff0c;不仅数据更新及时&#xff0c;而且完全免费&#xff0c;这对我们这些搞GIS开发的人来说简直是福音。不过刚开始用的…...

RT-Thread线程管理实战技巧与常见问题解析

1. RT-Thread线程管理实战指南在嵌入式系统开发中&#xff0c;线程管理是RTOS&#xff08;实时操作系统&#xff09;最核心的功能之一。作为一名长期使用RT-Thread的开发者&#xff0c;我发现很多初学者在掌握了线程理论后&#xff0c;在实际应用中仍然会遇到各种问题。本文将深…...

AI Agent不是你以为的那样

系列&#xff1a;《AI Agent 从原理到实战 —— 解密 Claude Code 背后的工程智慧》 第1篇引言 你大概有过这样的体验&#xff1a;打开 ChatGPT&#xff0c;说一句"帮我写封邮件&#xff0c;拒绝周五的会议邀请&#xff0c;语气委婉一点"&#xff0c;几秒钟后一封措辞…...

Joy-Con Toolkit:任天堂手柄全能管理解决方案

Joy-Con Toolkit&#xff1a;任天堂手柄全能管理解决方案 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit 核心价值&#xff1a;重新定义手柄控制体验 Joy-Con Toolkit作为开源手柄管理领域的创新工具&#xff0…...

全套R分析代码,空间转录组 + scRNA-seq揭示阿尔茨海默病抗体药机制

&#x1f680;科研不掉发&#xff0c;快来这个地表最强的生信神仙网站&#xff1a;中国银河生信云平台&#x1f449; 立即访问&#xff1a;https://usegalaxy.cn最佳Galaxy生信云平台教程&#xff1a;从入门到精通&#xff08;图文版&#xff09;转录组分析流程和工具大全&…...

选AI面试软件,为何一定要看中防作弊、可解释、全场景?

想象一下&#xff1a;你花了半个月筛选简历&#xff0c;终于确定了100个面试候选人&#xff0c;却发现一半人在用AI生成器写答案、用提词器念稿&#xff0c;甚至找人替考&#xff1b;好不容易拿到AI评分&#xff0c;却看不懂分数怎么来的&#xff0c;候选人质疑时你根本没法解释…...

Intv_AI_MK11 Android应用集成指南:在移动端调用AI模型服务

Intv_AI_MK11 Android应用集成指南&#xff1a;在移动端调用AI模型服务 1. 移动端AI集成的价值与挑战 想象一下&#xff0c;你的Android应用突然拥有了理解用户意图、自动生成图片描述甚至进行自然对话的能力。这正是Intv_AI_MK11这类云端AI模型能为移动应用带来的变革。但在…...

XXL-SSO与Active Directory集成:企业级身份管理终极方案

XXL-SSO与Active Directory集成&#xff1a;企业级身份管理终极方案 XXL-SSO是一款分布式单点登录框架&#xff0c;能够帮助企业实现多系统统一身份认证与授权。本文将详细介绍如何将XXL-SSO与Active Directory集成&#xff0c;打造企业级身份管理解决方案&#xff0c;让用户认…...

OFA-VE开源多模态分析系统:GPU算力优化部署实操手册

OFA-VE开源多模态分析系统&#xff1a;GPU算力优化部署实操手册 1. 系统概述与核心价值 OFA-VE是一个基于阿里巴巴达摩院OFA大模型构建的多模态推理平台&#xff0c;专门用于分析图像内容与文本描述之间的逻辑关系。这个系统不仅能看懂图片内容&#xff0c;还能理解文字描述&…...