大话设计模式之状态模式

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

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

  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 函数中,我们创建了一个电梯对象,并通过调用其各种方法来模拟电梯的操作。
在每次操作时,根据当前状态的不同,电梯会表现出不同的行为,这正是状态模式的作用所在。*/

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

           

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/789157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 相关链接与子查询的练习,以及索引视图的简单概述

4月1日 索引与视图 一 销售查询问题复习链接和子查询 1&#xff09;子查询相关sql语句 -- 结果返回一个值 select 查询字段 from 表 where 字段 [ > < <>] (子查询的内容)-- 单列多行 select 查询字段 from 表 where 字段 in (子查询)-- 多列多行 select 查询字…

06 监听器

文章目录 SessionAttListenerDemo.javaSessionListenerDemo.javaProductController.java SessionAttListenerDemo.java package com.aistart.listener;import javax.servlet.ServletContext; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSess…

Tensorboard使用教程

Pytorch(九) —— Tensorboard(当有了tensorboard日志文件怎么可视化它)(同时显示多个模型)(vscode的tensorboard)(TensorboardX)_tensorboard --logdir-CSDN博客文章浏览阅读9.7k次&#xff0c;点赞10次&#xff0c;收藏56次。tensorboard.pyfrom tensorboardX import Summary…

NVIDIA Jetson Xavier NX增加swap分区大小

NVIDIA Jetson Xavier NX增加swap分区大小 1. 输入jtop查看swap空间大小 2. 依次输入命令 #1&#xff09;新增swapfile文件大小自定义 sudo fallocate -l 6G /var/swapfile #2&#xff09;配置该文件的权限 sudo chmod 600 /var/swapfile #3&#xff09;建立交换分区 sudo m…

最大子数组和-动态规划

53. 最大子数组和 问题&#xff1a;最大子数组和&#xff0c;找出数组中具有最大和的连续子数组。 思路&#xff1a; 暴力解法&#xff1a;通过两重循环遍历&#xff0c;得到所有子数组和。时间和空间复杂度都为O(n^2): class Solution {public int maxSubArray(int[] nums…

RuntimeError: Error compiling objects for extension虚拟环境和系统环境——添加、删除、修改环境变量

前言&#xff1a;因为一个报错RuntimeError: Error compiling objects for extension 没有配置cl.exe环境变量&#xff0c;我的应用场景是需要搞定虚拟环境变量配置 RuntimeError: Error compiling objects for extension手把手带你解决&#xff08;超详细&#xff09;-CSDN博…

爬虫 红网时刻 获取当月指定关键词新闻 并存储到CSV文件

目标网站&#xff1a;红网 爬取目的&#xff1a;为了获取某一地区更全面的在红网已发布的宣传新闻稿&#xff0c;同时也让自己的工作更便捷 环境&#xff1a;Pycharm2021&#xff0c;Python3.10&#xff0c; 安装的包&#xff1a;requests&#xff0c;csv&#xff0c;bs4&…

如何在pgAdmin中用替换的值更新jsonb列?(二)

上一篇提到怎么替换jsonb&#xff0c;链接如下&#xff1a; 如何在pgAdmin中用替换的值更新jsonb列&#xff1f;-CSDN博客 那么当jsonb嵌套jsonb应该怎么替换呢&#xff1f;像这样&#xff0c;类型依然是jsonb&#xff0c;只不过嵌套一层&#xff0c;JsonData&#xff1a;&qu…

网络安全 | 什么是DDoS攻击?

关注WX&#xff1a;CodingTechWork DDoS-介绍 DoS&#xff1a;Denial of Service&#xff0c;拒绝服务。DDoS是通过大规模的网络流量使得正常流量不能访问受害者目标&#xff0c;是一种压垮性的网络攻击&#xff0c;而不是一种入侵手段。NTP网络时间协议&#xff0c;设备需要…

Springboot整合Milvus向量库

1. Milvus的Maven依赖&#xff0c; 配置如下 <dependency><groupId>io.milvus</groupId><artifactId>milvus-sdk-java</artifactId><version>2.3.4</version><exclusions><exclusion><artifactId>log4j-slf4j-imp…

百度语音识别

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、建号—获取试用KEY二、测试代码三、运行四、运行结果五、验证五、总结 一、建号—获取试用KEY https://console.bce.baidu.com/ai/#/ai/speech/overview/index…

Tomcat部署及安全加固

一、安装步骤 tomcat版本(8.5.81)&#xff1a; tar -zxvf apache-tomcat-8.5.81.tar.gz -C /app/ cd /app/ mv apache-tomcat-8.5.81/ tomcat/ chown -R webapp:app /app/tomcat二、安全加固 1. 禁止默认页面登录 rm -rf /app/tomcat/webapps mkdir -p /app/tomcat/webapps2…

阿里云python-SDK配置

OSS管理控制台 (aliyun.com) SDK地址 GitHub - aliyun/aliyun-oss-python-sdk: Aliyun OSS SDK for Python 下载文件并运行 python setup.py install oss2包配置完成。 上传、下载开发文档&#xff1a; Python SDK快速入门_对象存储(OSS)-阿里云帮助中心 (aliyun.com)

mybatis-plus-join,一个可以让mybatis-plus实现联表的插件

mybatis-plus-join mybatis-plus-join是mybatis plus的一个多表插件&#xff0c;上手简单&#xff0c;十分钟不到就能学会全部使用方式&#xff0c;只要会用mp就会用这个插件&#xff0c;仅仅依赖了lombok&#xff0c;而且是扩展mp的构造器并非更改原本的构造器&#xff0c;不会…

记一次Cannot deploy POJO class [xxx$$EnhancerBySpringCGLIB$$xxx]的错误

最近项目上需要使用websocket做服务端&#xff0c;那好说啊&#xff0c;直接springboot集成的websocket 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><versi…

赛氪网在长沙宣布启动“徽文化外宣翻译大赛”

2024年3月30日下午&#xff0c;在美丽的星城长沙&#xff0c;赛氪网作为承办方&#xff0c;在中国翻译协会年会期间成功举办了备受瞩目的“AI科技时代竞赛与就业分论坛”。此次论坛汇聚了众多翻译界、科技界和教育界的专家学者&#xff0c;共同就科技、实践、就业与竞赛人才培养…

一些关于机器学习的练习

为了加深机器学习基础并通过实践学习&#xff0c;收集了以下练习&#xff0c;覆盖了从数据探索、预处理到模型构建和评估的整个流程。这些练习按照机器学习的主要类型分为三部分&#xff1a;监督学习、无监督学习和强化学习。 监督学习练习 房价预测&#xff08;线性回归&…

使用C++调用讯飞星火API的详细指南

正文&#xff1a; 科大讯飞是中国领先的人工智能公司&#xff0c;其讯飞星火API为开发者提供了丰富的接口和服务&#xff0c;支持各种语音和语言技术的应用。下面是使用C接入讯飞星火API的步骤和代码示例。 步骤一&#xff1a;注册账号并创建应用 首先&#xff0c;您需要访问科…

蓝色wordpress外贸建站模板

蓝色wordpress外贸建站模板 https://www.mymoban.com/wordpress/7.html

ES 7.12官网阅读-ILM(index lifecycle management)

官网文档&#xff1a;ILM: Manage the index lifecycle | Elasticsearch Guide [7.12] | Elastic ILM&#xff1a;管理 index 的生命周期 可以根据你的性能、弹性、保存时长需求&#xff0c;使用ILM策略来自动管理你的index&#xff1b;比如 1. 当一个index达到确定的大小&a…