大话设计模式之状态模式

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

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

  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.hqwc.cn/news/590111.html

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

相关文章

云原生:应用敏捷,华为视角下的应用现代化

Gartner 也提出&#xff0c;到 2023 年&#xff0c;新应用新服务的数量将达到 5 亿&#xff0c;也即是说&#xff1a;“每个企业都正在成为软件企业”。据IDC 预测&#xff0c;到 2025 年三分之二的企业将成为多产的“软件企业”&#xff0c;每天都会发布软件版本。越来越多的企…

flutter获取手机中的系统路径信息

https://www.bilibili.com/video/BV1wE421g7sw获取系统中的路径 获取系统中的路径&#xff0c;并在这个路径中创建一个文本文件【str.txt】 然后进行写入【str.txt】 再读取这个文件【str.txt】 手机没有开通root权限无法看到写入到【应用程序文档目录】路径中的文件 用来…

06-编辑器

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

Rust线程间通信通讯channel的理解和使用

Channel允许在Rust中创建一个消息传递渠道&#xff0c;它返回一个元组结构体&#xff0c;其中包含发送和接收端。发送端用于向通道发送数据&#xff0c;而接收端则用于从通道接收数据。不能使用可变变量的方式&#xff0c;线程外面修改了可变变量的值&#xff0c;线程里面是拿不…

某团App之mtgsig2.4算法分析

1.3mtgsig参数分析&#xff1a; a0&#xff1a;mtgsig版本号&#xff08;这里分析2.4&#xff09; a1&#xff1a;appkey&#xff08;相同版本app此值固定&#xff09; a3&#xff1a;Android设备版本 a4&#xff1a;时间戳 a5&#xff1a;加密的设备信息1 a6&#xff1a;固定值…

并发编程之线程池的应用以及一些小细节的详细解析

线程池在实际中的使用 实际开发中&#xff0c;最常用主要还是利用ThreadPoolExecutor自定义线程池&#xff0c;可以给出一些关键的参数来自定义。 在下面的代码中可以看到&#xff0c;该线程池的最大并行线程数是5&#xff0c;线程等候区&#xff08;阻塞队列)是3&#xff0c;即…

利用sqoop实现sql表数据导入到Hadoop

1.在开发这创建好sql表后&#xff0c;开始执行下面步骤 2.sqoop的安装路径&#xff0c;我这里放在以下位置 3. 进入到option2脚本中&#xff0c;下面是脚本里的内容 下面四点要根据情况随时更改&#xff1a; 1>jdbc:mysql://node00:3306/数据库名 2>sid,sname->前…

循序渐进丨MogDB Ustore存储引擎剖析

背景 MogDB 数据库支持不同的存储引擎&#xff0c;其中行存引擎有Astore和Ustore&#xff0c;目前大部分客户场景使用的是Astore&#xff0c;也就是 Append Update&#xff08;追加更新&#xff09;模式。 Astore对于业务中的增、删以及HOT Update&#xff08;即同一页面内更新…

智慧城市治理:构建全域覆盖的城市时空感知体系

TSINGSEE青犀AI算法中台是一款平台型产品&#xff0c;专注于提供各行业中小场景部署解决方案。平台具备接入广、性能强、支持跨平台、芯片国产化等特点&#xff0c;可提供丰富的视图接入能力和智能分析能力。 平台采用了多项IT高新技术&#xff0c;包括视频编解码技术、嵌入式…

Web 后台项目,权限如何定义、设置、使用:菜单权限、按钮权限 ts element-ui-Plus

Web 后台项目&#xff0c;权限如何定义、设置、使用&#xff1a;菜单权限、按钮权限 ts element-ui-Plus 做一个后台管理项目&#xff0c;里面需要用到权限管理。这里说一下权限定义的大概&#xff0c;代码不多&#xff0c;主要讲原理和如何实现它。 一、权限管理的原理 权限…

elementui 实现一个固定位置的Pagination(分页)组件

系列文章目录 一、elementui 导航菜单栏和Breadcrumb 面包屑关联 二、elementui 左侧导航菜单栏与main区域联动 三、elementui 中设置图片的高度并支持PC和手机自适应 四、 elementui 实现一个固定位置的Pagination&#xff08;分页&#xff09;组件 文章目录 系列文章目录…

酷开科技智慧AI让酷开系统大显身手!

时代的浪潮汹涌而至&#xff0c;人工智能作为技术革新和产业变革的重要引擎&#xff0c;正深刻地影响着各行各业。在科技的海洋中&#xff0c;AI技术正逐渐渗透到我们的日常生活中&#xff0c;为我们带来前所未有的便捷和智慧。酷开科技用技术探索智慧AI&#xff0c;别看它只是…

企业家见识、智慧与胸怀:超越知识、聪明与财富的核心价值​

一、引言 在商界的风云变幻中&#xff0c;企业家们不仅需要拥有丰富的知识和聪明才智&#xff0c;更需要具备远见卓识、深刻智慧和博大胸怀。正如某知名企业家所言&#xff1a;“企业家见识比知识重要&#xff0c;智慧比聪明重要&#xff0c;胸怀比财富重要。”&#xff0c;这…

从零开始:Flutter应用上架iOS的完整流程解析

引言 &#x1f680; Flutter作为一种跨平台的移动应用程序开发框架&#xff0c;为开发者提供了便利&#xff0c;使他们能够通过单一的代码库构建出高性能、高保真度的应用程序&#xff0c;同时支持Android和iOS两个平台。然而&#xff0c;完成Flutter应用程序的开发只是第一步…

Spring Boot--文件上传和下载

文件上传和下载 前言文件上传1、以MultipartFile 接口流文件&#xff0c;流的名称需要和前台传过来的名称对应上2、获取到文件名称截取后缀3、为了放置文件名重复使用uuid来随机生成id后缀4、判断转存路径中是否有这个文件夹如果没有就创建5、将文件存储到转存的目录中 文件下载…

python的垃圾回收

引用计数器为主&#xff0c;标记清除和分代回收为辅 1 引用计数器 在python程序运行时&#xff0c;会根据数据类型的不同找到其对应的结构体&#xff0c;根据结构体中的字段来进行创建相关的数据&#xff0c;然后将对象添加到refchain双像链表中&#xff0c;每个对象中的ob_re…

线上研讨会 | 应对汽车毫米波雷达设计中的电磁挑战

智能汽车、新能源汽车最近几年一直是汽车行业关注的热点&#xff0c;随着5G技术越来越普及&#xff0c;汽车智能化发展将越来越迅速。从传统汽车到智能汽车&#xff0c;不是简单功能的增强&#xff0c;而是从单一功能的交通工具变成可移动的办公和娱乐空间&#xff0c;成为物联…

概率论经典题目-二维随机变量及分布--由概率密度求分布函数和概率

解答&#xff1a; 由概率密度函数求解分布函数的公式可知&#xff1a; 辅助图形加以确定积分上下限

CSS - 你知道都有哪些方案可以隐藏一个元素吗

难度级别&#xff1a;初级及以上 提问概率&#xff1a;70% 在前端开发中&#xff0c;隐藏元素并不是一个陌生的话题。根据业务场景不同&#xff0c;实现方案也多种多样&#xff0c;在面试中&#xff0c;应该尽可能多的描述自己遇到过的场景&…

【ElasticSearch】分词器(ElasticSearchIK分词器)

文章目录 1. 分词器介绍2. ik 分词器安装3. 分词器的使用 1. 分词器介绍 •IKAnalyzer 是一个开源的&#xff0c;基于java语言开发的轻量级的中文分词工具包•是一个基于Maven构建的项目•具有60万字/秒的高速处理能力•支持用户词典扩展定义 2. ik 分词器安装 IK 分词器安装…