设计模式_状态模式
状态模式
介绍
| 设计模式 | 定义 | 案例 | 问题堆积在哪里 | 解决办法 |
| 状态模式 | 一个对象 状态可以发生改变 不同的状态又有不同的行为逻辑 | 游戏角色 加载不同的技能 每个技能有不同的:攻击逻辑 攻击范围 动作等等 | 1 状态很多 2 每个状态有自己的属性和逻辑 | 每种状态单独写一个类 角色需要那个状态就加载哪一个 |
类图
角色:
stateBase 抽象状态
stateA 具体状态A
stateB 具体状态B
stateC 具体状态C
FactoryState 状态工厂

代码
RoleContext
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class RoleContext
{string name;StateBase currentState = null;public RoleContext(){name = "独孤求败";}// 展示动作public void ShowAction(){if (null != currentState){currentState.Action();}}// 切换状态public void ChangeActionState(StateBase newState){currentState = newState;}
}
StateBase
public abstract class StateBase
{public abstract void Action();
}
StateA
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class StateA : StateBase
{string name = "普攻";public override void Action(){Debug.Log("释放-" + name);}
}
StateB
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class StateB : StateBase
{string name = "次元斩";public override void Action(){Debug.Log("释放-" + name);}
}
StateC
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class StateC:StateBase
{string name = "升龙击";public override void Action(){Debug.Log("释放-" + name);}
}
FactoryState
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class FactoryState
{// 单例static FactoryState self = null;FactoryState() { }public static FactoryState Instance(){if (null == self)self = new FactoryState();return self;}Dictionary<string, StateBase> dic = new Dictionary<string, StateBase>();// 获取实例public StateBase GetStateIns(string className){StateBase ins = null;switch (className){case "StateA":{if (false == dic.ContainsKey(className))ins = new StateA();elseins = dic[className];}break;case "StateB":{if (false == dic.ContainsKey(className))ins = new StateB();elseins = dic[className];}break;case "StateC":{if (false == dic.ContainsKey(className))ins = new StateC();elseins = dic[className];}break;default:Debug.Log("未发现该类!");break;}return ins;}
}
测试代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TestZT : MonoBehaviour
{void Start(){RoleContext role = new RoleContext();// 切换技能Arole.ChangeActionState(FactoryState.Instance().GetStateIns("StateA"));role.ShowAction();// 切换技能Brole.ChangeActionState(FactoryState.Instance().GetStateIns("StateB"));role.ShowAction();// 切换技能Crole.ChangeActionState(FactoryState.Instance().GetStateIns("StateC"));role.ShowAction();}}
结果

总结
状态模式
1 是一个非常好用的 解耦合的手段, 角色不同的状态封装不同的(动作,属性,限制)
2 非常符合对修改封闭对扩展开发的原则。
3 让状态的职责更加的单一
4 也符合了依赖倒置 ,依赖了抽象
5 符合了迪米特原则,角色对状态类内部的具体实现不知道
相关文章:
设计模式_状态模式
状态模式 介绍 设计模式定义案例问题堆积在哪里解决办法状态模式一个对象 状态可以发生改变 不同的状态又有不同的行为逻辑游戏角色 加载不同的技能 每个技能有不同的:攻击逻辑 攻击范围 动作等等1 状态很多 2 每个状态有自己的属性和逻辑每种状态单独写一个类 角色…...
css 某个元素被挤的显示不完整,如何显示完整
加一行 flex-shrink: 0;解决...
pve lxc debian 11安装docker遇到bash: sudo: command not解决办法
pve创建LXC容器,使用debian 11模版,安装完成后正常换源、安装依赖 然后添加Docker 的官方 GPG 密钥时出错: $ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add - 提示 bash: sudo: command not …...
springboot的缓存和redis缓存,入门级别教程
一、springboot(如果没有配置)默认使用的是jvm缓存 1、Spring框架支持向应用程序透明地添加缓存。抽象的核心是将缓存应用于方法,从而根据缓存中可用的信息减少执行次数。缓存逻辑是透明地应用的,对调用者没有任何干扰。只要使用…...
语雀P0级时间爆发,留给运维的时间不多了?
事件背景 打工人的焦虑,已经延伸到在线文档了。近日,语雀P0级故障想必大家都有所体会,宕机近8小时,笔记、离线同步完全不可用。作为用户尤其担心我的文档资料是否会因此消失。 这泼天的8小时,放眼互联网界也是相当炸裂…...
LeetCode 2401.最长优雅子数组 ----双指针+位运算
数据范围1e5 考虑nlog 或者n的解法,考虑双指针 因为这里要求的是一段连续的数组 想起我们的最长不重复连续子序列 然后结合一下位运算就好了 是一道双指针不错的题目 class Solution { public:int longestNiceSubarray(vector<int>& nums) {int n nums…...
NOIP2023模拟6联测27 无穷括号序列
题目大意 小 C C C有一个括号序列 A A A,其长度为 m m m,且序列元素只包含左右括号。他想生成一个无限长的括号序列 B B B,由于 B B B的长度为正无穷,所以其下标可以为任意整数(可以为负)。为了由 A A A生…...
java spring cloud 工程企业管理软件-综合型项目管理软件-工程系统源码
Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示…...
openEuler 22.03 x86架构下docker运行arm等架构的容器——筑梦之路
为什么要这样做? 随着国产化的普及,国家政策对信创产业的支持,尤其一些金融证券行业、政府单位等,逐渐开始走国产化信创的路线,越来越多接触到国产 CPU (arm 平台,比如华为的鲲鹏处理器…...
【Java】HashMap常见的面试题
HashMap常见面试题 1.HashMap key 是否可以是为 我们自定义对象?——可以 2.HashMap 存储数据 有序还是无序?——无序 3.HashMap key 是否可以存放 null值?如果可以的话 存放在 数组中那个位置?——可以;存放在 index0的位置 4.Ha…...
openpnp - src - 配置文件载入过程的初步分析
文章目录 openpnp - src - 配置文件载入过程的初步分析概述笔记自己编译用的git版本报错截图问题1 - 怎么在调试状态下, 定位到抛异常的第一现场?结合单步调试找到的现场, 来分析报错的原因openpnp配置文件读取的流程END openpnp - src - 配置文件载入过程的初步分析 概述 从…...
中国各城市土地利用类型(城市功能)数据集(shp)
中国各城市土地利用类型(城市功能)数据集 时间:2018年 全国范围的城市用地类型数据(居住/商业/交通用地等共计11类) 分类:居住用地、商业用地、工业用地、医疗设施用地、体育文化设施用地、交通场站用地、绿地等用地类型 含城市编码、一级分类5个、二级分类11个 数据按…...
Linux网络编程:数据链路层
目录 一. 数据链路层概述 二. 以太网 2.1 以太网的概念 2.2 以太网数据帧 2.3 对于MAC地址的认识 2.4 数据碰撞问题 三. MTU和MSS 3.1 什么是MTU 3.2 MTU对UDP的影响 3.3 MTU对TCP的影响(MSS的概念) 四. ARP协议 4.1 ARP协议的作用 4.2 ARP数…...
python 线程 超时时间
python 线程 超时时间_mob649e815f0f18的技术博客_51CTO博客...
LeetCode:274. H 指数、275. H 指数 II(C++)
目录 274. H 指数 题目描述: 实现代码与解析: 排序暴力 275. H 指数 II 题目描述: 实现代码与解析: 二分 比较简单,不再写解析,注意二分的时候,r指针为n,含义为个数…...
多线程及锁
1.lock锁和synchronized锁的区别。 1:Synchronized 是Java的一个关键字,而Lock是java.util.concurrent.Locks 包下的一个接口; 2:Synchronized 使用过后,会自动释放锁,而Lock需要手动上锁、手动释放锁&am…...
C++ 写一个Data类的注意问题
Data类 声明和定义分离的一些问题 声明里面我们不带缺省参数,定义我们给缺省参数,如下面两段代码: Data.h#pragma once #include<iostream> using namespace std; class Data { public:Data(int year,int month,int day);private:in…...
postman做接口测试
之前搞自动化接口测试,由于接口的特性,要验证接口返回xml中的数据,所以没找到合适的轮子,就自己用requests造了个轮子,用着也还行,不过就是case管理有些麻烦,近几天又回头看了看postman也可以玩…...
hdlbits系列verilog解答(always块)-29
文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 由于数字电路由用网线连接的逻辑门组成,因此任何电路都可以表示为模块和赋值语句的某种组合。然而,有时这不是描述电路的最方便方式。过程procedure(其中 always 的块就是一个示例)提供了描述电路的替代语法…...
uniapp实现瀑布流
首先我们要先了解什么是瀑布流: 瀑布流(Waterfall Flow)是一种常见的网页布局方式,也被称为瀑布式布局或砌砖式布局。它通常用于展示图片、博客文章、商品等多个不同大小和高度的元素。 瀑布流布局的特点是每个元素按照从上到下…...
突破平台限制:基于Go+Qt5的喜马拉雅音频下载解决方案
突破平台限制:基于GoQt5的喜马拉雅音频下载解决方案 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 喜马拉雅FM作为国内…...
从OpenJDK到GraalVM:JDK21安装后,你还可以试试这些高性能Java运行时
从OpenJDK到GraalVM:JDK21安装后,你还可以试试这些高性能Java运行时 当你完成JDK21的基础安装后,Java生态的探索才刚刚开始。现代Java开发早已不再局限于传统JVM,越来越多的创新运行时正在重塑性能边界。本文将带你深入GraalVM、L…...
SRS (Simple Realtime Server) 实战:从SFU到大规模互动直播架构
1. SRS与SFU:互动直播的基石架构 第一次接触SRS时,我被它简洁的配置方式惊艳到了。这个看似轻量级的服务器,竟然能支撑起我们平台日均百万级的直播流量。作为选择性转发单元(SFU),SRS的核心价值在于它解决了…...
终极免费图像浏览器:90+格式支持与专业体验指南
终极免费图像浏览器:90格式支持与专业体验指南 【免费下载链接】ImageGlass 🏞 A lightweight, versatile image viewer 项目地址: https://gitcode.com/gh_mirrors/im/ImageGlass ImageGlass是一款专为Windows用户设计的轻量级开源图像浏览器&am…...
别再被机械按键坑了!FPGA消抖模块Verilog代码保姆级解析(附仿真波形)
FPGA按键消抖实战:从原理到Verilog实现的深度解析 刚接触FPGA开发的朋友们,一定遇到过这样的困扰——明明按下了按键,系统却像没反应一样;或者只按了一次,设备却识别出多次触发。这背后隐藏着一个看似简单却至关重要的…...
实战:基于Local Path Provisioner与Helm的RustFS云原生存储部署详解
1. RustFS与云原生存储架构解析 第一次接触RustFS是在去年帮客户设计对象存储方案时,当时被它用Rust语言实现的内存安全特性吸引。作为一款兼容S3协议的开源分布式存储系统,RustFS在性能测试中表现出色——单节点吞吐量能达到1.2GB/s,延迟控制…...
突破国际漫游限制:Nrfr免Root工具的终极解决方案
突破国际漫游限制:Nrfr免Root工具的终极解决方案 【免费下载链接】Nrfr 🌍 免 Root 的 SIM 卡国家码修改工具 | 解决国际漫游时的兼容性问题,帮助使用海外 SIM 卡获得更好的本地化体验,解锁运营商限制,突破区域限制 …...
从电动车痛点出发:双三相永磁电机如何靠‘弱磁’跑得更远更快?(深入对比凸极与隐极设计)
双三相永磁电机弱磁控制技术:破解电动车高速性能瓶颈的工程实践 电动车的高速巡航与急加速能力一直是用户关注的焦点,而永磁同步电机(PMSM)的弱磁控制技术正是解锁这一性能的关键。不同于传统三相电机,双三相永磁同步…...
实战调试:段页式内存管理中的首次页故障剖析
1. 段页式内存管理基础概念 段页式内存管理是现代操作系统的核心机制之一,它巧妙结合了分段和分页两种技术的优势。简单来说,就像我们整理衣柜时既按季节(分段)又用收纳盒(分页)来管理衣物。CPU看到的线性地…...
2026指纹浏览器与Web端设备识别技术的对抗与协同:从风控博弈到合规共生
在 2026 年的 Web 生态中,指纹浏览器与 Web 端设备识别技术始终处于 “对抗与协同” 的动态平衡中 —— 平台通过设备识别技术构建风控体系,防范恶意注册、批量操作、账号盗用等违规行为;指纹浏览器通过技术手段重构设备特征,实现…...
