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

大话设计模式之状态模式

状态模式是一种行为设计模式,它允许对象在其内部状态发生变化时改变其行为。在状态模式中,对象将其行为委托给当前状态对象,从而在不同的状态下执行不同的行为,而不必在对象自身的代码中包含大量的条件语句。

通常,状态模式包含以下几个关键角色:

  1. Context(上下文):持有一个状态对象的引用,可以设置当前状态,并在状态发生变化时通知当前状态对象执行相应的行为。

  2. State(状态):定义了一个接口或抽象类,用于封装与Context的一个特定状态相关的行为。

  3. ConcreteState(具体状态):实现了State接口或抽象类,在其中实现了与特定状态相关的行为。

状态模式的优点包括:

  • 将与状态相关的行为封装到不同的状态类中,使代码结构更清晰,易于维护和扩展。
  • 减少了条件语句的使用,提高了代码的可读性和可维护性。
  • 将状态转换逻辑集中在Context中,使得状态之间的切换更加简单。

但是,状态模式也有一些缺点,例如:

  • 增加了类的数量,可能会导致系统中存在大量的状态类,增加了系统的复杂性。
  • 在状态过多或状态转换逻辑复杂的情况下,可能会导致状态管理变得困难。

总的来说,状态模式适用于需要根据对象的内部状态改变其行为的情况,可以帮助提高代码的可维护性和灵活性。

#include <iostream>
#include <memory>// 抽象状态类
class ElevatorState {
public:virtual void open() = 0;virtual void close() = 0;virtual void run() = 0;virtual void stop() = 0;
};// 具体状态类:打开状态
class OpenState : public ElevatorState {
public:void open() override {std::cout << "The elevator is already open." << std::endl;}void close() override {std::cout << "Closing the elevator door." << std::endl;}void run() override {std::cout << "Cannot run when the door is open." << std::endl;}void stop() override {std::cout << "Stopping the elevator." << std::endl;}
};// 具体状态类:关闭状态
class CloseState : public ElevatorState {
public:void open() override {std::cout << "Opening the elevator door." << std::endl;}void close() override {std::cout << "The elevator door is already closed." << std::endl;}void run() override {std::cout << "Running the elevator." << std::endl;}void stop() override {std::cout << "Stopping the elevator." << std::endl;}
};// 上下文类:电梯
class Elevator {
private:std::shared_ptr<ElevatorState> state;public:Elevator() {// 初始状态为关闭状态state = std::make_shared<CloseState>();}void setState(std::shared_ptr<ElevatorState> newState) {state = newState;}void open() {state->open();}void close() {state->close();}void run() {state->run();}void stop() {state->stop();}
};int main() {Elevator elevator;elevator.open();  // Opening the elevator door.elevator.close(); // Closing the elevator door.elevator.run();   // Running the elevator.elevator.stop();  // Stopping the elevator.return 0;
}/*
在这个示例中,我们首先定义了一个抽象状态类 ElevatorState,包含了四个虚函数,
分别代表电梯的四种状态:打开、关闭、运行和停止。然后定义了两个具体状态类 OpenState 和 CloseState,
分别代表电梯的打开和关闭状态,并实现了抽象状态类中的四个虚函数。接着定义了一个上下文类 Elevator,表示电梯对象,其中包含一个状态对象的引用,
并提供了一系列操作电梯的方法,这些方法在运行时会根据电梯的当前状态委托给状态对象来执行相应的行为。在 main 函数中,我们创建了一个电梯对象,并通过调用其各种方法来模拟电梯的操作。
在每次操作时,根据当前状态的不同,电梯会表现出不同的行为,这正是状态模式的作用所在。*/

觉得有帮助的话,打赏一下呗。。

           

相关文章:

大话设计模式之状态模式

状态模式是一种行为设计模式&#xff0c;它允许对象在其内部状态发生变化时改变其行为。在状态模式中&#xff0c;对象将其行为委托给当前状态对象&#xff0c;从而在不同的状态下执行不同的行为&#xff0c;而不必在对象自身的代码中包含大量的条件语句。 通常&#xff0c;状…...

【机器学习】“强化机器学习模型:Bagging与Boosting详解“

1. 引言 在当今数据驱动的世界里&#xff0c;机器学习技术已成为解决复杂问题和提升决策制定效率的关键工具。随着数据的增长和计算能力的提升&#xff0c;传统的单一模型方法已逐渐无法满足高精度和泛化能力的双重要求。集成学习&#xff0c;作为一种结合多个学习算法以获得比…...

《QT实用小工具·九》设备按钮控件

1、概述 源码放在文章末尾 该项目实现了设备按钮控件&#xff0c;主要包含如下功能&#xff1a; 可设置按钮样式 圆形、警察、气泡、气泡2、消息、消息2。可设置按钮颜色 布防、撤防、报警、旁路、故障。可设置报警切换及对应报警切换的颜色。可设置显示的防区号。可设置是否…...

计算机服务器中了helper勒索病毒怎么办,helper勒索病毒解密流程步骤

随着网络技术在企业中的不断应用&#xff0c;越来越多的企业离不开网络&#xff0c;网络为企业提供了极大便利&#xff0c;大大提升了生产运营效率&#xff0c;由此而产生的网络数据安全问题也成为了企业关心的主要话题。近期&#xff0c;云天数据恢复中心接到多家企业的求助&a…...

qT 地图显示飞机轨迹

为了在Qt中显示飞机轨迹&#xff0c;你可以使用Qt的地图模块&#xff0c;例如Qt Location。以下是一个简单的示例&#xff0c;展示如何使用Qt地图模块显示飞机的轨迹。 首先&#xff0c;确保你的Qt项目文件(.pro)中包含了以下行来启用Qt Location模块&#xff1a; !include($…...

智慧展览馆:基于AI智能识别技术的视频智慧监管解决方案

一、建设背景 随着科技的不断进步和社会安全需求的日益增长&#xff0c;展览馆作为展示文化、艺术和科技成果的重要场所&#xff0c;其安全监控系统的智能化升级已成为当务之急。为此&#xff0c;旭帆科技&#xff08;TSINGSEE青犀&#xff09;基于视频智能分析技术推出了展览馆…...

Linux实用性脚本 [bash]

Linux实用性脚本 [bash] 1. 列出排名前 5 的CPU/内存占用进程2. iptables 自动屏蔽访问网站频繁的IP3. 自动发布 Java 项目&#xff08;Tomcat&#xff09;4. Nginx 访问日志分析脚本5. 查看网卡实时流量脚本6. 批量检测网站是否异常并邮件通知7. 目录入侵检测与告警8. 一键查看…...

Key exchange failed.No compatible key exchange method.

使用远程工具secureCRT (版本&#xff1a;Version 7.0.0 (x64 build 326) ) 连接Linux&#xff08;Ubuntu-22.04&#xff09;系统 若20之前的ubuntu系统版本参考&#xff1a;&#xff1a; &#x1f517;使用远程工具连接Linux系统 1、检查ssh-server版本 sudo dpk…...

【FAQ】HarmonyOS SDK 闭源开放能力 —Asset Store Kit

1.问题描述 使用关键资产API需要配置SystemCapability.Security.Asset&#xff0c;但不知道syscap.json文件应该配置在哪里&#xff0c;文档也没找到。 解决方案 新增关键资产等API可以直接参考开发指南里的示例代码进行调用&#xff1a; https://developer.huawei.com/cons…...

arm架构离线部署docker

1.首先检查服务器glibc版本 rpm -q glibc 如果 glibc-2.35版本以上&#xff0c;则参考下面安装步骤&#xff0c;包下载地址 链接&#xff1a;https://pan.baidu.com/s/1X64XrzRva0O7ZSekLZdIcA?pwd8k4c 提取码&#xff1a;8k4c glibc-2.35以上Docker离线安装 如下 mkdir …...

SpringBoot(48)-使用 SkyWalking 进行分布式链路追踪

Spring Boot&#xff08;48&#xff09;- 使用 SkyWalking 进行分布式链路追踪 介绍 在分布式系统中&#xff0c;了解各个服务之间的调用关系和性能表现是非常重要的。SkyWalking 是一款开源的分布式系统监控与分析平台&#xff0c;能够帮助我们实现分布式系统的链路追踪、性…...

JS实现双向数据绑定的三种方式

1、第一种是通过Proxy数据代理来达到双向绑定的,这是Vue3更新的双向绑定方式。 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Proxy双向绑定</title> <<...

Bash相关

Bash shell是Linux内核与用户之间的解释器程序 变量 自定义变量&#xff0c;名称可以用数字、字母、下划线、不能以数字开头&#xff0c;不能使用特殊符号&#xff0c;等号两边不能有空格 格式&#xff1a;变量名称值 环境变量&#xff0c;由系统提前定义好&#xff0c;使用…...

Flink 流批一体在模型特征场景的使用

摘要&#xff1a;本文整理自B站资深开发工程师张杨老师在 Flink Forward Asia 2023 中 AI 特征工程专场的分享。内容主要为以下四部分&#xff1a; 模型特征场景流批一体性能优化未来展望 一、 模型特征场景 以下是一个非常简化并且典型的线上实时特征和样本的生产过程。 前面…...

06-编辑器

gedit编辑器 gedit是Ubuntu系统自带的编辑器&#xff0c;可以用来轻度编辑和记录一些内容。 在终端中我们通过以下命令打开&#xff1a; gedit 要打开或者新建的文件名虽然Ubuntu的图形界面也能通过gedit打开文件&#xff0c;但是用终端打开gedit可以动用更高的权限&#xff…...

5.3.2 实验2:配置交换机端口安全

1、实验目的 通过本实验可以掌握&#xff1a; 交换机管理地址配置及接口配置。查看交换机的MAC地址表。配置静态端口安全、动态端口安全和粘滞端口安全的方法。 2、实验拓扑 配置交换机端口安全的实验拓扑如图所示。 配置交换机端口安全的实验拓扑 3、实验步骤 &#xff…...

【AIGC调研系列】通义千问、文心一言、抖音云雀、智谱清言、讯飞星火的特点分析

通义千问、文心一言、抖音云雀、智谱清言、讯飞星火这五款AI大模型各有特色&#xff0c;它们在市场上的定位和竞争策略也有所不同。 通义千问&#xff1a;由阿里巴巴推出&#xff0c;被认为是最接近ChatGPT水平的国产AI模型[7]。它不仅提供了长文档处理功能&#xff0c;还能够…...

【JVM】如何定位、解决内存泄漏和溢出

目录 1.概述 2.堆溢出、内存泄定位及解决办法 2.1.示例代码 2.2.抓堆快照 2.3.分析堆快照 1.概述 常见的几种JVM内存溢出的场景如下&#xff1a; Java堆溢出&#xff1a; 错误信息: java.lang.OutOfMemoryError: Java heap space 原因&#xff1a;Java对象实例在运行时持…...

常见网络问题的概述

网络问题概述 网络问题可能包括视频通话延迟、应用或网络速度慢、下载缓冲、VoIP质量差和互联网连接丢失等。 这些问题可能由硬件故障、使用模式变化、安全漏洞等引起&#xff0c;且可能对业务运营产生严重影响。 网络问题对企业的影响 网络问题不可避免&#xff0c;但可以…...

说说你对数据结构-树的理解

对树 - 二叉搜索树的理解 二叉搜索树是一种常见的二叉树结构&#xff0c;它具有以下特点&#xff1a; 每个节点最多只有两个子节点&#xff0c;分别称为左子节点和右子节点&#xff1b;对于任意节点&#xff0c;其左子树中的所有节点均小于该节点&#xff0c;其右子树中的所有…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...