状态模式

文章目录

  • 1.UML类图
  • 2.状态基类
  • 3.状态实现类
  • 3.状态机管理类
  • 使用示例

1.UML类图

在这里插入图片描述

2.状态基类

public abstract class State 
{public string? Name { get; set; }public StateMachine? StateMachine {get; set;}public abstract void Exit();public abstract void Enter();
}

3.状态实现类

  1. StateA
public class StateA : State 
{public StateA(string name) {Name = name;}public override void Enter(){Console.WriteLine("进入状态A,Name:{0}", Name);}public override void Exit(){Console.WriteLine("退出状态A,Name:{0}", Name);}
}
  1. StateB
public class StateB : State 
{public StateB(string name) {Name = name;}public override void Enter(){Console.WriteLine("进入状态B,Name:{0}", Name);}public override void Exit(){Console.WriteLine("退出状态B,Name:{0}", Name);}  
}
  1. StateC
public class StateC : State 
{public StateC(string name) {Name = name;}public override void Enter(){Console.WriteLine("进入状态C,Name:{0}", Name);}public override void Exit(){Console.WriteLine("退出状态C,Name:{0}", Name);}  
}

3.状态机管理类

public class StateMachine 
{public string? Name {get; set;}  private List<State> states = new List<State>();private State? CurrentState;public StateMachine(string name) {Name = name;}public void AddState(State state) {if (!states.Contains(state)){states.Add(state);state.StateMachine = this;}}public void RemoveState(State state) {if (states.IndexOf(state) == -1)return;state.Exit();CurrentState = null;states.Remove(state);}public void ChangeState(State state) {CurrentState?.Exit();CurrentState = state;CurrentState.Enter();}public void Switch2NextState() {if (CurrentState != null){int index = states.IndexOf(CurrentState);// 排除状态不存在和最后一个状态的情况    if (index == -1)return;if (index + 1 >= states.Count)return;CurrentState.Exit();CurrentState = states[index + 1]; }else    // 当前状态为空 则直接进入列表中的第一个状态{CurrentState = states[0];}CurrentState.Enter();}public void Switch2PreviousState() {if (CurrentState != null){int index = states.IndexOf(CurrentState);// 排除状态不存在和第一个状态的情况    if (index == -1)return;if (index == 0)return;CurrentState.Exit();CurrentState = states[index - 1]; }else    // 当前状态为空 则直接进入列表中的最后一个状态{CurrentState = states[states.Count - 1];}CurrentState.Enter();}
}  

使用示例

StateMachine stateMachine = new StateMachine("状态模式测试");
stateMachine.AddState(new StateA("状态A"));
StateB stateB = new StateB("状态B");
stateMachine.AddState(stateB);
stateMachine.AddState(new StateC("状态C"));stateMachine.Switch2NextState();
stateMachine.Switch2NextState();
stateMachine.Switch2NextState();
stateMachine.Switch2PreviousState();
stateMachine.Switch2PreviousState();
stateMachine.ChangeState(stateB);/*
进入状态A,Name:状态A
退出状态A,Name:状态A
进入状态B,Name:状态B
退出状态B,Name:状态B
进入状态C,Name:状态C
退出状态C,Name:状态C
进入状态B,Name:状态B
退出状态B,Name:状态B
进入状态A,Name:状态A
退出状态A,Name:状态A
进入状态B,Name:状态B
*/

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

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

相关文章

生成删除数据库表数据的SQL语句

--获取表的名称及用表中第一列的注释作表的说明 select delete from ,Name2 ,--,RANK()OVER (ORDER BY Name2 DESC) as 序号,字段说明 from ( select bb.name as Name2,cc.* from ( select min(minor_id) as minor_id,id from ( SELECT g.minor_id minor_id,a.Name as Name …

解析vue.config.js文件

一、用途 创建 Vue 项目时&#xff0c;默认情况下是没有 vue.config.js 文件的。Vue CLI 会提供一组默认的配置&#xff0c;用于构建和开发项目&#xff0c;这些配置在内部被封装好了&#xff0c;并不需要用户手动创建 vue.config.js 文件来进行配置。通过在项目根目录下创建 …

重生奇迹MU首饰属性之迷

雷&#xff1a;抵抗移位、掌心雷 冰&#xff1a;抵抗冰度冻、冰封问箭、暴风雪、冰封 毒&#xff1a;降低中毒几率&#xff08;中毒不掉血&#xff09;、毒咒、毒炎 风&#xff1a;抵抗移位旋风斩&#xff08;没试过不过很多人用&#xff09;、龙卷风 至于火水地因为并没有…

分布式与一致性协议之Paxos算法(三)

Paxos算法 兰伯特关于Multi-Paxos的思考 领导者 我们可以通过引入领导者(Leader)节点来解决第一个问题。也就是说将领导者节点作为唯一提议者&#xff0c;如图所示。这样就不存在多个提议者同时提交提案的情况&#xff0c;也就不存在提案冲突的情况了。这里补充一点:在论文中…

NAT网络地址转换实验(思科)

华为设备参考&#xff1a;NAT网络地址转换实验&#xff08;华为&#xff09; 一&#xff0c;技术简介 NAT&#xff08;Network Address Translation&#xff09;&#xff0c;即网络地址转换技术&#xff0c;是一种在现代计算机网络中广泛应用的技术&#xff0c;主要用于有效管…

游戏新手村23:游戏数据分析都是谁在看数据

不管是做端游页游还是手游&#xff0c;不管是做市场广告投放还是游戏运营&#xff0c;都需要看数据。有的人说“数据会说话”&#xff0c;也有人说“数据会说谎”&#xff0c;有的人言必谈大数据&#xff0c;有的人则能善于从细小的数据着手发现问题。 我知道和了解的一些游戏…

react怎么只让接口请求一次

在React中&#xff0c;确保接口只请求一次通常涉及到组件的生命周期和状态管理。以下是一些常用的策略&#xff1a; 使用组件的useEffect钩子&#xff08;函数组件&#xff09;: 如果你使用的是函数组件&#xff0c;你可以使用useEffect钩子来发起请求&#xff0c;并确保它只在…

SpringBoot - java.lang.NoClassDefFoundError: XXX

问题描述 以 json-path 为例&#xff1a;java.lang.NoClassDefFoundError: com/jayway/jsonpath/Configuration 原因分析 编译不报错&#xff0c;但是运行时报错。 遇到这样类似的问题&#xff0c;首先就要想到是不是 Jar 包冲突引起的&#xff0c;或者引入的不是理想的 Jar…

数据仓库实验二:关联规则挖掘实验

目录 一、实验目的二、实验内容和要求三、实验步骤1、创建数据库和表2、挖掘关联规则&#xff08;1&#xff09;新建一个 Analysis Services 项目 Sales&#xff08;2&#xff09;建立数据源视图&#xff08;3&#xff09;建立挖掘结构 Sales.dmm&#xff08;4&#xff09;部署…

Java集合相关的List、Set、Map基础知识

目录 一、集合介绍 二、List 三、Map HashMap的数据结构 如何理解红黑树 四、set 一、集合介绍 在Java中&#xff0c;集合是一种用于存储对象的数据结构&#xff0c;它提供了一种更加灵活和强大的方式来处理和操作数据。Java集合框架提供了一系列接口和类&#xff0c;用…

Pointnet++改进即插即用系列:全网首发PPA反向残差移动块 |即插即用,提升特征提取模块性能

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入PPA,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤三

Transformer模型详解01-Word Embedding

文章目录 前言Transformer 整体结构Transformer 的输入单词 Embedding原理CBOW 模型one-hot构建 CBOW 训练数据集构建 CBOW 神经网络训练 CBOW 神经网络 Skip-gram 模型one-hot构建 Skip-gram训练数据集训练 Skip-gram神经网络 Word2Vec实例数据训练保存和加载 前言 Transform…

【上岗认证】错题整理记录

目录 &#x1f31e;一、阶段1&#xff1a;编码规范 &#x1f30a;编码规范考试-CC &#x1f31e;二、阶段2&#xff1a;开发基础 &#x1f30a;C/C &#x1f30a;数据库&#xff08;Oracle/MySql&#xff09; &#x1f31e;三、阶段3&#xff1a;测试基础 &#x1f30a;…

Springboot+Vue项目-基于Java+MySQL的家政服务平台系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

实时数仓选型

实时数仓选型 实时数仓选型第一版实时数仓选型第二版 实时数仓选型第一版 实时数仓分层: 计算框架:Flink;存储框架:消息队列(可以实时读取&可以实时写入)ODS:Kafka 使用场景:每过来一条数据,读取到并加工处理DIM: HBase 使用场景:事实表会根据主键获取一行维表数据(1.永…

jna中出现错误解决方案。

jna中出现错误解决方案 为什么会出现这些错误之JNA版本的锅不要手动导入jar包&#xff0c;使用maven切换高版本会出现的错误Structure.getFieldOrder() on class 错误java.lang.IllegalArgumentException: Invalid calling convention 63 错误 为什么会出现这些错误之JNA版本的…

人体跟随小车(旭日x3派,yolov5,ros2)

最终现象 人体跟随 策略 底盘主控是stm32f103c8t6&#xff0c;读取左右轮编码器并标定速度&#xff0c;读取mpu6050的yaw值一并传至上位机。上位机通过usb摄像头捕获图像&#xff0c;送入模型进行推理&#xff0c;根据得到的结果生成控制指令下发给底盘进行人体跟随。

【MySQL】redolog、undolog和binlog日志文件详解

【MySQL】redolog、undolog和binlog日志文件详解 前言redolog设计目标记录内容写入策略 undolog设计目标记录内容写入策略 binlog设计目标记录内容写入策略 小结 前言 当谈论MySQL数据库的日志文件时&#xff0c;通常会涉及到三种主要类型&#xff1a;redo log&#xff08;重做…

使用Python进行自然语言处理:情感分析

使用Python进行自然语言处理的热门应用:情感分析 自然语言处理(NLP)是人工智能领域中的一个重要分支,它致力于使计算机能够理解、解释和生成人类语言。在NLP的诸多应用中,情感分析是一项备受关注的热门应用之一。情感分析(Sentiment Analysis)是通过分析文本中的情感色…

陪诊小程序开发:线上陪诊行业的发展

在人口老龄化的严重的当下&#xff0c;老人看病也更加困难&#xff0c;而陪诊行业作为一个新型行业&#xff0c;正在走入人们的生活中&#xff0c;帮助大众解决看病难等问题&#xff0c;为大众带来便捷高效的就医环境。 随着互联网时代的到来&#xff0c;各行各业也都开始向线…