行为设计模式之状态模式

文章目录

  • 概述
    • 定义
    • 结构图
  • 2.代码示例
  • 小结

概述

定义

状态模式(state pattern)的定义: 允许一个对象在其内部状态改变时改变它的行为。 对象看起来似乎修改了它的类。

状态模式就是用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题.。状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中(用类来表示状态) ,使得对象状态可以灵活变化。

结构图

状态模式结构图

  • 上下文信息类(Context):实际上就是存储当前状态的类,对外提供更新状态的操作。在该类中维护着一个抽象状态接口State实例,这个实例定义当前状态.

  • 抽象状态类(State):可以是一个接口或抽象类,用于定义声明状态更新的操作方法有哪些,具体实现由子类完成。

  • 具体状态类(StateA 等):实现抽象状态类定义的方法,根据具体的场景来指定对应状态改变后的代码实现逻辑。

2.代码示例

// 抽象状态类
class State {
public:virtual void Handle(std::string input, std::shared_ptr<State> &currentState) = 0;
};// 具体状态A
class StateA : public State {
public:void Handle(std::string input, std::shared_ptr<State> &currentState) override {if (input == "A") {std::cout << "StateA: Handle input A." << std::endl;} else if (input == "B") {std::cout << "StateA: Transition to StateB." << std::endl;currentState = std::make_shared<StateB>();} else {std::cout << "StateA: Invalid input." << std::endl;}}
};// 具体状态B
class StateB : public State {
public:void Handle(std::string input, std::shared_ptr<State> &currentState) override {if (input == "B") {std::cout << "StateB: Handle input B." << std::endl;} else if (input == "C") {std::cout << "StateB: Transition to StateC." << std::endl;currentState = std::make_shared<StateC>();} else {std::cout << "StateB: Invalid input." << std::endl;}}
};// 具体状态C
class StateC : public State {
public:void Handle(std::string input, std::shared_ptr<State> &currentState) override {if (input == "C") {std::cout << "StateC: Handle input C." << std::endl;} else if (input == "A") {std::cout << "StateC: Transition to StateA." << std::endl;currentState = std::make_shared<StateA>();} else {std::cout << "StateC: Invalid input." << std::endl;}}
};// 上下文类,维护当前状态并执行请求
class Context {
private:std::shared_ptr<State> currentState;
public:Context(std::shared_ptr<State> initialState) : currentState(initialState) {}void Request(std::string input) {currentState->Handle(input, currentState);}
};

小结

这篇文章主要说了状态模式的定义,结构图,以及代码示例;这些都很常用的,不管是生活中,还是开发中,都是这样的。道理呢,往往很简单,看看代码示例,再想想现实生活,可能就理解了。OK,翻篇。

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

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

相关文章

Apache Doris 2.1.3 版本正式发布!

亲爱的社区小伙伴们&#xff0c;Apache Doris 2.1.3 版本已于 2024 年 5 月 20 日正式发布。该版本在功能特性上对数据湖、物化视图、负载管理等方面进行了多项更新&#xff0c;进一步简化湖仓一体架构、加速了查询性能&#xff1b;同时提交了若干改进项以及问题修复&#xff0…

简单的网页分享按钮代码

创建一个网页分享按钮通常涉及到HTML、CSS和JavaScript的组合使用。下面是一个简单的示例代码&#xff0c;展示了如何创建一个包含微博、QQ和QQ空间分享的按钮。请注意&#xff0c;这只是一个前端的实现示例&#xff0c;实际分享功能需要依赖于相应的社交媒体平台提供的API或分…

Flutter 中的 CompositedTransformFollower 小部件:全面指南

Flutter 中的 CompositedTransformFollower 小部件&#xff1a;全面指南 在Flutter的动画和视觉效果世界中&#xff0c;CompositedTransformFollower是一个高级组件&#xff0c;它允许开发者创建复杂的跟随动画。这个小部件通常用于实现视差效果或者当一个组件需要跟随另一个组…

New Phytologist:杨树特有miRNA在调控杨树抗旱中的分子机制

2024年3月6日&#xff0c;林木遗传育种全国重点实验室、北京林业大学生物科学与技术学院尹伟伦与夏新莉教授课题组在New Phytologist&#xff08;中科院一区&#xff0c;影响因子9.4&#xff09;期刊发表了题为“The miR6445-NAC029 module regulates drought tolerance by reg…

CSS:transform作用

transform作用 介绍常用函数&#xff1a;1.平移&#xff08;Translate&#xff09;介绍代码举例 2.旋转&#xff08;Rotate&#xff09;介绍代码举例 3.缩放&#xff08;Scale&#xff09;介绍代码举例 4.倾斜&#xff08;Skew&#xff09;介绍代码举例 5.矩阵变换&#xff08;…

selenium 学习笔记(一)

pip的安装 新建一个txt curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py 把上面的代码复制进去后&#xff0c;把后缀名改为.bat然后双击运行 当前目录会出现一个这个文件 然后在命令行pyhon get-pip.py等它下好就可以了selenium安装 需要安装到工程目…

linux查看是否被入侵(二)

1、检查异常系统文件 [rootbastion-IDC ~]# find / -uid 0 -perm -4000 -print [rootbastion-IDC ~]# find / -size 10000k –print [rootbastion-IDC ~]# find / -name "…" –print [rootbastion-IDC ~]# find / -name ".." –print [rootbastion-I…

云计算-Lambda事件 (Lambda Events)

检索事件信息 (Retrieving Event Information) 在上一个主题中&#xff0c;我们已经看到了如何创建一个Lambda函数、添加handler、添加触发器和配置执行策略。在本主题中&#xff0c;我们将对其进行扩展。到目前为止&#xff0c;我们看到的handler应用非常简单&#xff0c;但我…

香橙派——创建Service打开热点

文章目录 要创建一个service来创建热点&#xff0c;你可以按照以下步骤进行操作&#xff1a; 创建一个service文件&#xff1a; sudo vim /etc/systemd/system/hotspot.service这将使用nano编辑器创建一个新的service文件。 在打开的文件中&#xff0c;添加以下内容&#xff1…

linux 定时执行shell、python脚本

在linux里设置定时执行一般是用crontab&#xff0c;如果没有的话&#xff0c;可以先安装&#xff1a; 安装 查看是否安装 cron -v # 对于基于Debian的系统&#xff08;如Ubuntu&#xff09; sudo apt-get install cron# 对于基于RedHat的系统&#xff08;如CentOS&#xff…

【5】:三维到二维变换(模型、视图、投影)

观测变换 物体上某一点的坐标变换顺序&#xff1a;M->V->P MVP变换用来描述视图变换的任务&#xff0c;即将虚拟世界中的三维物体映射&#xff08;变换&#xff09;到二维坐标中。 1.Model Transformation 模型变换 场景中每个物体上的某一点&#xff0c;从局部坐标系…

YoloV8实战:各种图绘制汇总(mAP50、mAP50-95、loss、PR_curve、F1_curve)|科研必备|绘图神器

摘要 本文的内容是告诉大家如何绘制mAP50、mAP50-95、loss、PR_curve、F1_curve等图像,方便大家写论文。 绘制mAP50、mAP50-95、loss等图。 先上效果,如下图: 首先将,训练的result.csv汇总到一个文件夹下面(这样方便寻找),要不然找起来太麻烦。如下图: 我都放到re…

Pyinstaller打包exe文件解决指南

打包命令 打包 Python 文件 输入如下格式的命令即可 默认命令 Pyinstaller 文件名.py Pyinstaller -option1 -option2 -... 要打包的文件 Pyinstaller 文件名.pyPyinstaller -option1 -option2 -... 要打包的文件 参数选项比较多&#xff0c;这里我列一个表&#xff1a;…

onnx模型转换到rknn脚本

from rknn.api import RKNN ONNX_MODEL ./onnx_models/yolov5s_rm_transpose.onnx # platform"rk1808" platform "rv1109" RKNN_MODEL yolov5s_relu_{}_out_opt.rknn.format(platform) if __name__ __main__: add_perm False # 如果设置成True,则将模…

[C#]winform部署官方yolov10目标检测的onnx模型

【框架地址】 https://github.com/THU-MIG/yolov10 【算法介绍】 今天为大家介绍的是 YOLOv10&#xff0c;这是由清华大学研究团队最新提出的&#xff0c;同样遵循 YOLO 系列设计原则&#xff0c;致力于打造实时端到端的高性能目标检测器。 方法 创新 双标签分配策略 众所…

灯塔工厂产业数字化平台解决方案(50页PPT)

方案介绍&#xff1a; 随着工业4.0和智能制造的快速发展&#xff0c;传统工厂正面临着转型升级的迫切需求。为了提升生产效率、优化资源配置、增强市场竞争力&#xff0c;我们推出了灯塔工厂产业数字化平台解决方案。该方案旨在通过先进的信息技术手段&#xff0c;将传统工厂转…

ROS 程序框架

ROS 程序框架 基本思路&#xff08;以C为例&#xff09; 使用catkin_create_pkg创建一个软件包在软件包的src文件夹下创建一个节点的cpp源码文件在节点的源码文件中include包含ROS的头文件构建一个main函数&#xff0c;并在函数的开头执行ros::init()构建while循环&#xff0…

蒙特卡洛法求解机械臂工作空间(以IRB4600型工业机械臂为例)

1. 概念 工作空间是衡量机器人工作能力的一个重要的运动学指标&#xff0c;蒙特卡洛法是一种随机模拟方法&#xff0c;用于在计算机上估计某些统计量&#xff0c;对于要估计的统计量&#xff0c;通过模拟大量的随机抽样&#xff0c;并计算这些样本的随机值来估算这个统计量的值…

数字信号处理实验三:IIR数字滤波器设计及软件实现

一、实验目的 1. 掌握MATLAB中进行IIR模拟滤波器的设计的相关函数的应用&#xff1b; 2. 掌握MATLAB的工具箱中提供的常用IIR数字滤波器的设计函数的应用&#xff1b; 3.掌握MATLAB的工具箱中提供的模拟滤波器转数字滤波器的相关的设计函数的应用。 二、实验内容 本实验为…

CC1310 Debug interface is locked

XDS110连接CC1310板子&#xff0c;打开Smart RF 弹出窗口如下&#xff1a; 解决办法&#xff1a; 1 打开SmartRF Flash Programmer 2 选择连接的设备CC1310, 弹出如下窗口&#xff0c;点击OK。 3 点击Tools图标&#xff0c;选择CC26XX/CC13XX Forced Mass Erase。 4 在弹出的…