设计模式 --- 状态模式

状态模式​​是一种​​行为型设计模式​​,允许对象在内部状态改变时动态改变其行为​​,使对象的行为看起来像是改变了。该模式通过将状态逻辑拆分为独立类​​,消除复杂的条件分支语句,提升代码的可维护性和扩展性。
状态模式的核心价值​​在于​​解耦状态逻辑与上下文​​,为复杂状态管理提供结构化解决方案。在游戏开发中,它尤其适合管理角色控制、AI行为等动态状态流转场景,但需权衡类膨胀和性能成本。

优点:

1. ​​消除复杂条件分支:消除大量if-else或switch语句,避免代码臃肿且难以维护,将每个分支独立为一个状态类,通过状态切换取代条件分支。
2.提高扩展性:新增状态无需修改上下文类,只需添加新的状态类即可。
3.职责单一化:每个状态类仅关注自身行为,符合单一职责原则。
4.状态转换显式管理:状态转换条件封装在状态类中,避免分散在代码各处。
5.提高可测试性:每个状态可单独测试,无需依赖其他逻辑。

缺点: 

1.类数量增多:每个状态对应一个类,可能导致类数量过多。(例如10个状态 → 10个类 + 接口 + 上下文类)
优化:
       1.​使用 ​​层级状态机​​ 合并相似状态(如 BaseMovementState 派生 Walk/Run)。
       2.对简单状态使用 ​​枚举 + 委托​​ 简化实现。
2.Context数据共享:状态类需访问上下文数据,可能导致过度暴露接口(如Player类需向状态类公开血量、位置等字段)。
优化:
        1.将共享数据封装为 ​​上下文接口​​,限制访问权限。
        2.通过事件/委托通信,减少直接依赖。
3.性能开销:频繁创建/销毁状态对象可能影响性能(如每帧切换状态)。
优化:
         1.使用​​对象池​​复用状态实例。

说明例子:

1.UML类图:

2.实现:

1.定义State的抽象类:

    public abstract class State{protected Context m_Context = null;public State(Context _context){m_Context = _context;}public abstract void Handler(int value);}

2.定义Context类:

    public class Context{State m_State = null;public void Request(int value){m_State.Handler(value);}public void SetState(State state){Debug.Log("Context.SetState:" + state);m_State = state;}}

3.定义具体状态类:ConcreteStateA、ConcreteStateB、ConcreteStateC

    public class ConcreteStateA : State{public ConcreteStateA(Context _context) : base(_context){}public override void Handler(int value){Debug.Log("ConcreteStateA.Handler");if (value > 10){m_Context.SetState(new ConcreateStateB(m_Context));}}}public class ConcreateStateB : State{public ConcreateStateB(Context _context) : base(_context){}public override void Handler(int value){Debug.Log("ConcreteStateB.Handler");if (value > 20){m_Context.SetState(new ConcreateStateC(m_Context));}}}public class ConcreateStateC : State{public ConcreateStateC(Context _context) : base(_context){}public override void Handler(int value){Debug.Log("ConcreteStateC.Handler");if (value > 30){m_Context.SetState(new ConcreteStateA(m_Context));}}}

4.测试类:

public class StateParttern : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){Context context = new Context();context.SetState(new ConcreteStateA(context));context.Request(5);context.Request(15);context.Request(25);context.Request(35);}
}

游戏中的使用场景:

​​1.角色行为管理​​:玩家状态 --> 站立、移动、跳跃、攻击、死亡。
​​2.AI决策系统​​:敌人AI --> 巡逻、追击、攻击、逃跑。
​3.​UI界面切换​​:游戏菜单 --> 主界面、设置、背包、暂停。
4.场景切换:游戏场景 --> 开始场景、大厅场景、战斗场景切换。
​​5.物理交互系统​​:物体状态 --> 静止、运动、碰撞、销毁。

总结:

状态模式的核心价值​​在于解耦状态逻辑与上下文​​,为复杂状态管理提供结构化解决方案。在游戏开发中,它尤其适合管理角色控制、AI行为等动态状态流转场景,但需权衡类膨胀和性能成本。

参考书籍:

《Hands-On Game Development Patterns with Unity 2019》

《设计模式与游戏完美开发》

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

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

相关文章

【读者求助】如何跨行业进入招聘岗位?

文章目录 读者留言回信岗位细分1. 中介公司的招聘岗位2. 猎头专员3. 公司的招聘专员选择建议 面试建议1. 请简单介绍你过去 3 年的招聘工作经历,重点说下你负责的岗位类型和规模2. 你在招聘流程中最常用的渠道有哪些?如何评估渠道效果?3. 当你…

AI Agent入门指南

图片来源网络 ‌一、开箱暴击:你以为的"智障音箱",其实是赛博世界的007‌ ‌1.1 从人工智障到智能叛逃:Agent进化史堪比《甄嬛传》‌ ‌青铜时代(2006-2015)‌ “小娜同学,关灯” “抱歉&…

pnpm 中 Next.js 模块无法找到问题解决

问题概述 项目在使用 pnpm 管理依赖时,出现了 “Cannot find module ‘next/link’ or its corresponding type declarations” 的错误。这是因为 pnpm 的软链接机制在某些情况下可能导致模块路径解析问题。 问题诊断 通过命令 pnpm list next 确认项目已安装 Next.js 15.2.…

vulnhub:sunset decoy

靶机下载地址https://www.vulnhub.com/entry/sunset-decoy,505/ 渗透过程 简单信息收集 nmap 192.168.56.0/24 -Pn # 确定靶机ip:192.168.56.121 nmap 192.168.56.121 -A -T4 # 得到开放端口22,80 在80端口得到save.zip,需要密码解压。 john破解压缩…

代码学习总结(一)

代码学习总结(一) 这个系列的博客是记录下自己学习代码的历程,有来自平台上的,有来自笔试题回忆的,主要基于 C 语言,包括题目内容,代码实现,思路,并会注明题目难度&…

OSPF的接口网络类型【复习篇】

OSPF在不同网络环境下默认的不同工作方式 [a3]display ospf interface g 0/0/0 # 查看ospf接口的网络类型网络类型OSPF接口的网络类型(工作方式)计时器BMA(以太网)broadcast ,需要DR/BDR的选举hello:10s…

PHM学习软件|PHM预测性维护系统

使用步骤教程如下 1、登录 用户名:52phm 密码:xxx (区别在于不同用户密钥不一样) 2、上传需要分析的数据集 支持数据集格式:csv、xlsx、xls、mat、json 3、主题1:机械参数计算 计算轴承、齿轮、皮带的…

MySQL MVCC 机制详解

MySQL MVCC 机制详解 1. MVCC 基本概念 MVCC 是一种并发控制的方法,主要用于数据库管理系统,允许多个事务同时读取数据库中的同一个数据项,而不需要加锁,从而提高了数据库的并发性能。 ┌──────────────────…

Model Context Protocol (MCP) - 尝试创建和测试一下MCP Server

1.简单介绍 MCP是Model Context Protocol的缩写,是Anthropic开源的一个标准协议。MCP使得大语言模型可以和外部的数据源,工具进行集成。当前MCP在社区逐渐地流行起来了。同时official C# SDK(仓库是csharp-sdk) 也在不断更新中,目前最新版本…

(三)行为模式:12、访问者模式(Visitor Pattern)(C++示例)

目录 1、访问者模式含义 2、访问者模式的UML图学习 3、访问者模式的应用场景 4、访问者模式的优缺点 5、访问者模式C实现的实例 1、访问者模式含义 访问者模式(Visitor Pattern)是一种行为型设计模式,它允许将一个作用于某对象结构中的各…

windows安卓子系统wsa隐藏应用列表的安装激活使用

Windows 11 安卓子系统应用部署全攻略 windows安卓子系统wsa隐藏应用列表的安装激活使用|过检测核心前端 在 Windows 11 系统中,安卓子系统为用户带来了在电脑上运行安卓应用的便利。经过一系列的操作,我们已经完成了 Windows 11 安卓子系统的底层和前端…

Elasticsearch 集群搭建

一、集群规划 1.1 节点角色规划 节点类型配置要求推荐数量Master节点低磁盘、中等CPU/内存3(奇数防止脑裂)Data节点高磁盘、高内存、多核CPU根据数据量扩展Coordinating节点高CPU/内存、低磁盘2(可选) 1.2 硬件建议 内存&…

React 响应事件

开发环境:Reacttsantd 使用 React 可以在 JSX 中添加 事件处理函数。其中事件处理函数为自定义函数,它将在响应交互(如点击、悬停、表单输入框获得焦点等)时触发。 学习内容 1.编写事件处理函数的不同方法 2.如何从父组件传递事件…

SQL基础入门:从CRUD到JOIN再到索引(通俗易懂版)

一、为什么需要SQL? 想象你在管理一个图书馆: 传统方法:手动记录每本书的位置、借阅者、归还日期SQL方法:用数据库系统自动管理,快速查询《Java编程思想》在哪个书架 SQL(Structured Query Language&…

MINIQMT学习课程Day11

现在开始进行策略的交易买卖分析: 还是之前的步骤,打开qmt,选择独立交易, 之后使用pycharm,编写py文件 导入包: import time, datetime, traceback, sys from xtquant import xtdata from xtquant.xttr…

# 实时人脸性别与年龄识别:基于OpenCV与深度学习模型的实现

实时人脸性别与年龄识别:基于OpenCV与深度学习模型的实现 在当今数字化时代,计算机视觉技术正以前所未有的速度改变着我们的生活与工作方式。其中,人脸检测与分析作为计算机视觉领域的重要分支,已广泛应用于安防监控、智能交互、…

Python Cookbook-5.14 给字典类型增加排名功能

任务 你需要用字典存储一些键和“分数”的映射关系。你经常需要以自然顺序(即以分数的升序)访问键和分数值,并能够根据那个顺序检查一个键的排名。对这个问题,用dict 似乎不太合适。 解决方案 我们可以使用 dict 的子类,根据需要增加或者重…

十四种逻辑器件综合对比——《器件手册--逻辑器件》

目录 逻辑器件 简述 按功能分类 按工艺分类 按电平分类 特殊功能逻辑器件 应用领域 详尽阐述 1 逻辑门 一、基本概念 二、主要类型 三、实现方式 四、应用领域 2 反相器 工作原理 基本功能 主要应用 常见类型 特点 未来发展趋势 3 锁存器 基本概念 工作原理 主要类型…

如何更改wsl2中的ubuntu默认安装位置

先前的一篇文章提到了如何更改wsl里面ubuntu的home目录,wsl装ubuntu的home目录在哪,如何更改home?_wsl安装的ubuntu在哪里-CSDN博客 这次是要更改wsl中ubuntu的安装目录,毕竟默认安装到c盘下会占用不少空间的。 从微软商店get后…

最近在工作中感受到了设计模式的重要性

之前了解设计模式:只是应付一下面试 在之前一年多的工作中也没遇到使用场景 最近在搭建验证环境的时候,才发现这玩意这么重要 首先是设计模式的使用场景一定是在很复杂繁琐的场景下进行的 之所以说是复杂/繁琐的场景,因为一些场景也许逻辑不难…