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

【C++设计模式之状态模式:行为型】分析及示例

简介

状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态改变时改变其行为,看起来就像是改变了其类。状态模式将对象的状态封装成不同的类,并使得对象在不同状态下有不同的行为。

描述

状态模式通过将每种状态封装成一个独立的类,然后将具体状态类的行为委托给Context类,使得Context类在不同的状态下具有不同的行为。这样,当Context对象的状态发生变化时,它的行为也会随之改变。

原理

状态模式由三个核心组件组成:Context(上下文类)、State(抽象状态类)和ConcreteState(具体状态类)。

  • Context类负责定义切换状态的口,并维护一个对当前状态对象的引用。Context类将具体的状态行为委托给当前状态对象。
  • State类是一个抽象类,定义了具体状态类需要实现的方法,以及在不同状态下Context对象应该具有的行为。
  • ConcreteState类是具体的状态类,实现了State类定义的方法,并根据当前状态下的需求来执行相应的逻辑。

类图

在这里插入图片描述

示例

假设有一个电梯系统,其中电梯有三种状态:打开状态(OpenState)、关闭状态(ClosedState)运行状态(RunningState)。当电梯处于不同的状态时,它的行为也不同。

C++示例代码如下:

#include <iostream>// Context
class Elevator {
public:virtual void open() = 0;virtual void close() = 0;virtual void run() = 0;
};// State
class ElevatorState {
public:virtual void open(Elevator* elevator) = 0;virtual void close(Elevator* elevator) = 0;virtual void run(Elevator* elevator) = 0;
};// ConcreteState
class OpenState : public ElevatorState {
public:void open(Elevator* elevator) override {std::cout << "The elevator is already open." << std::endl;}void close(Elevator* elevator) override {std::cout << "Closing the elevator..." << std::endl;elevator->setState(new ClosedState());}void run(Elevator* elevator) override {std::cout << "Cannot run the elevator while it is open." << std::endl;}
};class ClosedState : public ElevatorState {
public:void open(Elevator* elevator) override {std::cout << "Opening the elevator..." << std::endl;elevator->setState(new OpenState());}void close(Elevator* elevator) override {std::cout << "The elevator is already closed." << std::endl;}void run(Elevator* elevator) override {std::cout << "Running the elevator..." << std::endl;elevator->setState(new RunningState());}
};class RunningState : public ElevatorState {
public:void open(Elevator* elevator) override {std::cout << "Cannot open the elevator while it is running." << std::endl;}void close(Elevator* elevator) override {std::cout << "Cannot close the elevator while it is running." << std::endl;}void run(Elevator* elevator) override {std::cout << "The elevator is already running." << std::endl;}
};// Concrete Context
class ElevatorSystem : public Elevator {
public:ElevatorSystem() {currentState = new ClosedState();}void setState(ElevatorState* state) {delete currentState;currentState = state;}void open() override {currentState->open(this);}void close() override {currentState->close(this);}void run() override {currentState->run(this);}private:ElevatorState* currentState;
};// 使用示例
int main() {ElevatorSystem system;system.open();  // Opening the elevator...system.open();  // The elevator is already open.system.close(); // Closing the elevator...system.run();   // Running the elevator...system.close(); // The elevator is already closed.system.open();  // Opening the elevator...system.run();   // Cannot run the elevator while it is open.return 0;
}

输出结果

Opening the elevator...
The elevator is already open.
Closing the elevator...
Running the elevator...
The elevator is already closed.
Opening the elevator...
Cannot run the elevator while it is open.

解释

在上述示例中,Elevator类是上下文类(Context),它定义了切换状态的接口,并维护一个对当前状态对象的引用。ElevatorState是抽象状态类(State),它定义了具体状态类需要实现的方法。OpenState、ClosedState和RunningState是具体状态类(ConcreteState),它们分别实现了ElevatorState的方法,并根据当前状态下的需求执行相应的逻辑。
在示例中,创建了一个电梯系统(ElevatorSystem),初始状态为关闭状态(ClosedState)。通过调用ElevatorSystem的open、close和run方法来切换电梯的状态,并根据不同的状态执行相应的操作。

结论

状态模式通过将对象的状态封装成独立的类,并委托给Context类来管理,达到了解耦的目的。当对象的状态发生变化时,它的行为也会相应地发生变化。

状态模式适用于以下情况:

  • 当一个对象的行为取决于其状态,并且需要在运行时根据状态改变行为时,可以使用状态模式。
  • 当一个类有很多状态,并且状态之间的转换非常复杂时,可以使用状态模式来将每个状态的行为解耦合。

状态模式常见的应用场景包括订单状态管理、电梯状态控制、游戏角色状态机等。

相关文章:

【C++设计模式之状态模式:行为型】分析及示例

简介 状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象在内部状态改变时改变其行为&#xff0c;看起来就像是改变了其类。状态模式将对象的状态封装成不同的类&#xff0c;并使得对象在不同状态下有不同的行为。 描述 状态模式通过…...

微信小程序使用路由传参和传对象的方法

近期在做微信小程序开发&#xff0c;在页面跳转时&#xff0c;需要携带参数到下一个页面&#xff0c;尤其是将对象传入页面。为了方便重温&#xff0c;特此记录。 路由传字符串参数 原始页面 传递字符串参数比较简单。路由跳转有两种方式&#xff0c;一种是通过navigator组件…...

中国创可贴市场研究与未来预测报告(2023版)

内容简介&#xff1a; 创可贴由胶布&#xff08;带&#xff09;、吸水垫、防粘层等组成&#xff0c;胶布以弹性布、棉布、无纺布或PE、PVC、PU打孔膜、TPU等材料为常见基材&#xff0c;涂以氧化锌和橡胶为主要原料的胶浆或医用压敏胶黏剂或丙烯酸酯胶粘剂制成。 目前中国主要…...

水库安全监测方案(实时数据采集、高速数据传输)

​ 一、引言 水库的安全监测对于防止水灾和保障人民生命财产安全至关重要。为了提高水库安全监测的效率和准确性&#xff0c;本文将介绍一种使用星创易联DTU200和SG800 5g工业路由器部署的水库安全监测方案。 二、方案概述 本方案主要通过使用星创易联DTU200和SG800 5g工业路…...

vue项目 ueditor使用示例

简介 UEditor是由百度Web前端研发部开发的所见即所得富文本web编辑器&#xff0c;具有轻量&#xff0c;功能丰富&#xff0c;易扩展等特点。UEditor支持常见的文本编辑功能&#xff0c;如字体、颜色、大小、加粗、斜体、下划线、删除线等&#xff0c;同时还支持超链接、图片上…...

深度学习笔记之优化算法(四)Nesterov动量方法的简单认识

机器学习笔记之优化算法——Nesterov动量方法的简单认识 引言回顾&#xff1a;梯度下降法与动量法Nesterov动量法Nesterov动量法的算法过程描述总结 引言 上一节对动量法进行了简单认识&#xff0c;本节将介绍 Nesterov \text{Nesterov} Nesterov动量方法。 回顾&#xff1a;…...

比 N 小的最大质数

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…...

JavaScript 生成随机颜色

代码 function color(color) {return (color "0123456789abcdef"[Math.floor(Math.random() * 6)]) && (color.length 6 ? color : arguments.callee(color)); }使用 // 用法1&#xff1a;全部随机生成 "#" color(""); // #201050…...

Savepoints

语法 SAVEPOINT 名称 RELEASE SAVEPOINT 名称 ROLLBACK TRANSACTION TO SAVEPOINT 名称 Savepoints 与BEGIN和COMMIT类似的创建事务的方法&#xff0c;名称不要求唯一且可以嵌套使用。 可以用在BEGIN…COMMIT定义的事务内部或外部。当在外部时&#xff0c;最外层的savepoin…...

【MySQL】基本查询(二)

文章目录 一. 结果排序二. 筛选分页结果三. Update四. Delete五. 截断表六. 插入查询结果结束语 操作如下表 //创建表结构 mysql> create table exam_result(-> id int unsigned primary key auto_increment,-> name varchar(20) not null comment 同学姓名,-> chi…...

Qt:多语言支持,构建全面应用程序“

Qt&#xff1a;强大API、简化框架、多语言支持&#xff0c;构建全面应用程序" 强大的API&#xff1a;Qt提供了丰富的API&#xff0c;包括250多个C类&#xff0c;基于模板的集合、序列化、文件操作、IO设备、目录管理、日期/时间等功能。还包括正则表达式处理和支持2D/3D…...

性能监控-链路级监控工具

常见的链路监控工具&#xff0c;我们都称之为 APM 开源工具 几个开源的好用的工具&#xff0c;它们分别是 Pinpoint、SkyWalking、Zipkin、CAT 网络上也有人对这几个工具做过测试 比对&#xff0c;得到的结论是每个产品对性能的影响都在 10% 以下&#xff0c;其中 SkyWalking …...

clickonce 程序发布到ftp在使用cnd 加速https 支持下载,会不会报错

ClickOnce 是一种用于发布和部署.NET应用程序的技术&#xff0c;通常用于本地部署或通过网络分发应用程序。将 ClickOnce 程序发布到 FTP 服务器并使用 CDN&#xff08;内容分发网络&#xff09;进行加速是可能的&#xff0c;但要确保配置正确以避免出现错误。 在使用 CDN 加速…...

Nginx详细学习记录

1. Nginx概述 Nginx是一个轻量级的高性能HTTP反向代理服务器&#xff0c;同时它也是一个通用类型的代理服务器&#xff0c;支持绝大部分协议&#xff0c;如TCP、UDP、SMTP、HTTPS等。 1.1 Nginx基础架构 Nginx默认采用多进程工作方式&#xff0c;Nginx启动后&#xff0c;会运行…...

golang gin——中间件编程以及jwt认证和跨域配置中间件案例

中间件编程jwt认证 在不改变原有方法的基础上&#xff0c;添加自己的业务逻辑。相当于grpc中的拦截器一样&#xff0c;在不改变grpc请求的同时&#xff0c;插入自己的业务。 简单例子 func Sum(a, b int) int {return a b }func LoggerMiddleware(in func(a, b int) int) f…...

如何快速制作令人惊叹的长图海报

在当今的数字时代&#xff0c;制作一张吸引人的长图海报已成为许多人的需求。无论是为了宣传活动&#xff0c;还是展示产品&#xff0c;一张设计精美的长图海报都能引起人们的注意。下面&#xff0c;我们将介绍一种简单的方法&#xff0c;使用在线海报制作工具来创建长图海报。…...

D (1092) : DS循环链表—约瑟夫环(Ver. I - A)

Description N个人坐成一个圆环&#xff08;编号为1 - N&#xff09;&#xff0c;从第S个人开始报数&#xff0c;数到K的人出列&#xff0c;后面的人重新从1开始报数。依次输出出列人的编号。 例如&#xff1a;N 3&#xff0c;K 2&#xff0c;S 1。 2号先出列&#xff0c;然…...

Python爬虫(二十二)_selenium案例:模拟登陆豆瓣

本篇博客主要用于介绍如何使用seleniumphantomJS模拟登陆豆瓣&#xff0c;没有考虑验证码的问题&#xff0c;更多内容&#xff0c;请参考&#xff1a;Python学习指南 #-*- coding:utf-8 -*-from selenium import webdriver from selenium.webdriver.common.keys import Keysimp…...

1. Flink程序打Jar包

文章目录 步骤注意事项 步骤 用 maven 打 jar 包&#xff0c;需要在 pom.xml 文件中添加打包插件依赖 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><ver…...

水波纹文字效果动画

效果展示 CSS 知识点 text-shadow 属性绘制立体文字clip-path 属性来绘制水波纹 工具网站 CSS clip-path maker 效果编辑器 页面整体结构实现 使用多个 H2 标签来实现水波纹的效果实现&#xff0c;然后使用clip-path结合动画属性一起来进行波浪的起伏动画实现。 <div …...

Z-Image-Turbo镜像优化指南:如何调整参数获得更佳生成效果

Z-Image-Turbo镜像优化指南&#xff1a;如何调整参数获得更佳生成效果 1. 镜像核心参数解析 Z-Image-Turbo作为一款高性能文生图模型&#xff0c;其效果很大程度上取决于参数配置。理解这些参数的作用是优化生成效果的第一步。 1.1 基础参数说明 prompt&#xff08;提示词&…...

UnrealPakViewer实战指南:解决Pak文件解析难题的5个创新方法

UnrealPakViewer实战指南&#xff1a;解决Pak文件解析难题的5个创新方法 【免费下载链接】UnrealPakViewer 查看 UE4 Pak 文件的图形化工具&#xff0c;支持 UE4 pak/ucas 文件 项目地址: https://gitcode.com/gh_mirrors/un/UnrealPakViewer 当你面对10GB加密Pak包&…...

YOLOv8在智慧农业中的落地实践:如何提升植物病害检测准确率到90%+

YOLOv8在智慧农业中的落地实践&#xff1a;如何提升植物病害检测准确率到90% 在智慧农业领域&#xff0c;植物病害的早期识别与精准诊断一直是技术攻关的重点。传统人工检测方式不仅效率低下&#xff0c;而且受限于专家经验&#xff0c;难以实现规模化应用。随着计算机视觉技术…...

实时与非实时操作系统核心技术对比与应用解析

实时与非实时操作系统技术解析1. 操作系统分类概述现代计算机系统根据任务调度机制的不同&#xff0c;主要分为实时操作系统(RTOS)和分时操作系统两大类。这两类系统在任务调度、资源分配和响应机制等方面存在本质区别&#xff0c;适用于不同的应用场景。1.1 实时操作系统定义实…...

探索Beyond All Reason:重新定义开源实时战略游戏体验

探索Beyond All Reason&#xff1a;重新定义开源实时战略游戏体验 【免费下载链接】Beyond-All-Reason www.beyondallreason.info 项目地址: https://gitcode.com/gh_mirrors/be/Beyond-All-Reason Beyond All Reason是一款基于Spring引擎开发的开源实时战略&#xff08…...

还在为跨平台模组烦恼?这款工具让你一键获取Steam创意内容

还在为跨平台模组烦恼&#xff1f;这款工具让你一键获取Steam创意内容 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否也曾遇到这样的困境&#xff1a;在Epic Games Stor…...

幼儿园招生报名小程序源码 微信报名系统

介绍这是一款幼儿园招生报名小程序&#xff0c;以新学期招生报名为核心&#xff0c;兼顾幼儿园环境图文展示&#xff08;室内、室外、文娱、起居&#xff09;、招生政策答疑、最新动态新闻、食谱介绍、报名项目海报分享等功能。家长可填写幼儿基本信息、住址信息、监护人信息等…...

避坑指南:StarRocks聚合模型排序键的5个常见错误配置(含性能对比测试)

StarRocks聚合模型排序键配置实战&#xff1a;从性能陷阱到最佳实践 当电商平台的UV统计查询从3秒延长到30秒&#xff0c;当数据仓库的存储空间以每天10%的速度膨胀&#xff0c;很多团队才意识到——聚合模型的排序键配置出了问题。作为StarRocks最核心的性能杠杆&#xff0c;排…...

Python实战:出租车计费模拟器开发(附完整代码与测试用例)

Python实战&#xff1a;出租车计费模拟器开发&#xff08;附完整代码与测试用例&#xff09; 出租车计费系统是城市交通中不可或缺的一部分&#xff0c;而用Python模拟这一过程不仅能帮助初学者理解条件分支和输入输出处理&#xff0c;还能培养将现实问题转化为代码的思维能力。…...

李慕婉-仙逆-造相Z-Turbo效果展示:精美动漫角色生成案例

李慕婉-仙逆-造相Z-Turbo效果展示&#xff1a;精美动漫角色生成案例 1. 惊艳效果预览&#xff1a;从文字到动漫角色的魔法 输入一段简单的文字描述&#xff0c;就能生成栩栩如生的动漫角色形象——这就是李慕婉-仙逆-造相Z-Turbo模型带来的神奇体验。作为专为《仙逆》角色李慕…...