状态模式

ops/2024/10/21 3:09:15/

文章目录

  • 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.ppmy.cn/ops/27233.html

相关文章

网络安全-Diffie Hellman密钥协商

密钥协商是保密通信双方&#xff08;或更多方&#xff09;通过公开信道来共同形成密钥的过程。一个密钥协商方案中&#xff0c;密钥的值是某个函数值&#xff0c;其输入量由两个成员&#xff08;或更多方&#xff09;来提供。密钥协商的记过是参与协商的双方&#xff08;或更多…

微信小程序播放编码为 video/mp4;codecs=vp8 opus 的视频没有声音

最近在做浏览器录屏功能&#xff0c;主要是录屏加上麦克风生成mp4视频&#xff0c;最终生成的是编码为 video/mp4;codecsvp8 opus 的视频&#xff0c;音频编码因为是 opus 是无法在小程序正常播放的&#xff0c;这样就导致了视频没有声音。后来就在服务端做了一层转换&#xff…

网络应用层之(6)L2TP协议详解

网络应用层之(6)L2TP协议 Author: Once Day Date: 2024年5月1日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的…

5G前传光纤传输的25G光模块晶振SG2016CAN

一款适用于5G前传光纤传输网络中的25G光模块的5G晶振SG2016CAN。随着5G时代的到来&#xff0c;5G晶振的重要性也不言而喻&#xff0c;小体积宽温晶振SG2016CAN可以用于5G前传的25G光模块&#xff0c;具有高稳定性、小体积、宽温等优势。在5G前传光纤传输网络中&#xff0c;25G光…

代码随想录学习Day 32

738.单调递增的数字 题目链接 讲解链接 暴力解法&#xff1a; class Solution:def check(self, n): # 判断是否各位单调递增max 10while n:x n % 10if max > x:max xelse:return Falsen n // 10return Truedef monotoneIncreasingDigits(self, n: int) -> int:f…

OceanBase 分布式数据库【信创/国产化】- OceanBase 通过 MySql 客户端连接 OceanBase 租户

本心、输入输出、结果 文章目录 OceanBase 分布式数据库【信创/国产化】- OceanBase 通过 MySql 客户端连接 OceanBase 租户前言OceanBase 数据更新架构前提条件连接操作连接示例OceanBase 分布式数据库【信创/国产化】- OceanBase 通过 MySql 客户端连接 OceanBase 租户 编辑 …

vue3 使用pinia -- vue2 vuex的plus版

接入状态store 即 vuex 呃(⊙﹏⊙)vuex这里可以略过了&#xff0c;我在研究完后&#xff0c;才发现vue3出来个pinia&#xff0c;是vuex的升级&#xff0c;体积更小更省事&#xff0c;我不删这里了&#xff0c;单纯记录下&#x1f642; --pinia用法下面有写哦 ① 执行 npm insta…

SAP PP学习笔记09 - 作业区(工作中心Work Center)Customize2(管理码,班次顺序,计算式),标准Text,作业区阶层

上文讲了作业区&#xff08;工作中心&#xff09;的概念及其中重要字段&#xff0c;以及作业区的部分Customize。 SAP PP学习笔记08 - 作业区&#xff08;工作中心Work Center&#xff09;&#xff0c;作业区Customize-CSDN博客 本文继续讲 作业区的Customize。 Spro > 生…