当前位置: 首页 > news >正文

设计模式_状态模式

状态模式

介绍

设计模式定义案例问题堆积在哪里解决办法
状态模式一个对象 状态可以发生改变
不同的状态又有不同的行为逻辑
游戏角色 加载不同的技能
每个技能有不同的:攻击逻辑 攻击范围 动作等等
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 符合了迪米特原则,角色对状态类内部的具体实现不知道

相关文章:

设计模式_状态模式

状态模式 介绍 设计模式定义案例问题堆积在哪里解决办法状态模式一个对象 状态可以发生改变 不同的状态又有不同的行为逻辑游戏角色 加载不同的技能 每个技能有不同的&#xff1a;攻击逻辑 攻击范围 动作等等1 状态很多 2 每个状态有自己的属性和逻辑每种状态单独写一个类 角色…...

css 某个元素被挤的显示不完整,如何显示完整

加一行 flex-shrink: 0;解决...

pve lxc debian 11安装docker遇到bash: sudo: command not解决办法

pve创建LXC容器&#xff0c;使用debian 11模版&#xff0c;安装完成后正常换源、安装依赖 然后添加Docker 的官方 GPG 密钥时出错&#xff1a; $ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add - 提示 bash: sudo: command not …...

springboot的缓存和redis缓存,入门级别教程

一、springboot&#xff08;如果没有配置&#xff09;默认使用的是jvm缓存 1、Spring框架支持向应用程序透明地添加缓存。抽象的核心是将缓存应用于方法&#xff0c;从而根据缓存中可用的信息减少执行次数。缓存逻辑是透明地应用的&#xff0c;对调用者没有任何干扰。只要使用…...

语雀P0级时间爆发,留给运维的时间不多了?

事件背景 打工人的焦虑&#xff0c;已经延伸到在线文档了。近日&#xff0c;语雀P0级故障想必大家都有所体会&#xff0c;宕机近8小时&#xff0c;笔记、离线同步完全不可用。作为用户尤其担心我的文档资料是否会因此消失。 这泼天的8小时&#xff0c;放眼互联网界也是相当炸裂…...

LeetCode 2401.最长优雅子数组 ----双指针+位运算

数据范围1e5 考虑nlog 或者n的解法&#xff0c;考虑双指针 因为这里要求的是一段连续的数组 想起我们的最长不重复连续子序列 然后结合一下位运算就好了 是一道双指针不错的题目 class Solution { public:int longestNiceSubarray(vector<int>& nums) {int n nums…...

NOIP2023模拟6联测27 无穷括号序列

题目大意 小 C C C有一个括号序列 A A A&#xff0c;其长度为 m m m&#xff0c;且序列元素只包含左右括号。他想生成一个无限长的括号序列 B B B&#xff0c;由于 B B B的长度为正无穷&#xff0c;所以其下标可以为任意整数&#xff08;可以为负&#xff09;。为了由 A A A生…...

java spring cloud 工程企业管理软件-综合型项目管理软件-工程系统源码

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…...

openEuler 22.03 x86架构下docker运行arm等架构的容器——筑梦之路

为什么要这样做&#xff1f; 随着国产化的普及&#xff0c;国家政策对信创产业的支持&#xff0c;尤其一些金融证券行业、政府单位等&#xff0c;逐渐开始走国产化信创的路线&#xff0c;越来越多接触到国产 CPU &#xff08;arm 平台&#xff0c;比如华为的鲲鹏处理器&#xf…...

【Java】HashMap常见的面试题

HashMap常见面试题 1.HashMap key 是否可以是为 我们自定义对象&#xff1f;——可以 2.HashMap 存储数据 有序还是无序&#xff1f;——无序 3.HashMap key 是否可以存放 null值&#xff1f;如果可以的话 存放在 数组中那个位置&#xff1f;——可以;存放在 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的影响&#xff08;MSS的概念&#xff09; 四. ARP协议 4.1 ARP协议的作用 4.2 ARP数…...

python 线程 超时时间

python 线程 超时时间_mob649e815f0f18的技术博客_51CTO博客...

LeetCode:274. H 指数、275. H 指数 II(C++)

目录 274. H 指数 题目描述&#xff1a; 实现代码与解析&#xff1a; 排序暴力 275. H 指数 II 题目描述&#xff1a; 实现代码与解析&#xff1a; 二分 比较简单&#xff0c;不再写解析&#xff0c;注意二分的时候&#xff0c;r指针为n&#xff0c;含义为个数&#xf…...

多线程及锁

1.lock锁和synchronized锁的区别。 1&#xff1a;Synchronized 是Java的一个关键字&#xff0c;而Lock是java.util.concurrent.Locks 包下的一个接口&#xff1b; 2&#xff1a;Synchronized 使用过后&#xff0c;会自动释放锁&#xff0c;而Lock需要手动上锁、手动释放锁&am…...

C++ 写一个Data类的注意问题

Data类 声明和定义分离的一些问题 声明里面我们不带缺省参数&#xff0c;定义我们给缺省参数&#xff0c;如下面两段代码&#xff1a; Data.h#pragma once #include<iostream> using namespace std; class Data { public:Data(int year,int month,int day);private:in…...

postman做接口测试

之前搞自动化接口测试&#xff0c;由于接口的特性&#xff0c;要验证接口返回xml中的数据&#xff0c;所以没找到合适的轮子&#xff0c;就自己用requests造了个轮子&#xff0c;用着也还行&#xff0c;不过就是case管理有些麻烦&#xff0c;近几天又回头看了看postman也可以玩…...

hdlbits系列verilog解答(always块)-29

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 由于数字电路由用网线连接的逻辑门组成,因此任何电路都可以表示为模块和赋值语句的某种组合。然而,有时这不是描述电路的最方便方式。过程procedure(其中 always 的块就是一个示例)提供了描述电路的替代语法…...

uniapp实现瀑布流

首先我们要先了解什么是瀑布流&#xff1a; 瀑布流&#xff08;Waterfall Flow&#xff09;是一种常见的网页布局方式&#xff0c;也被称为瀑布式布局或砌砖式布局。它通常用于展示图片、博客文章、商品等多个不同大小和高度的元素。 瀑布流布局的特点是每个元素按照从上到下…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...