news 2026/8/27 22:29:00

游戏中的开发模式有哪些?一篇带你了解常用的设计模式!<二>

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
游戏中的开发模式有哪些?一篇带你了解常用的设计模式!<二>

续接上篇,我们介绍了:

单例:全局唯一的核心管理(玩家数据,体力,音效)

工厂:统一创建规则的对象(角色,武器,怪物)

状态:多状态切换的对象(角色/怪物行为)

我们结合了原神每个场景介绍了这几种设计模式,设计模式其实是一种“不脱离业务的抽象概念”,而是贴合具体场景的“解决方案“。

1.观察者模式(行为)-------游戏事件通知

原神的”体力恢复“”角色突破“”活动结束“等事件,需要通知多个模块:

体力恢复事件:通知UI(更新体力数值),任务系统(检测是否完成”消耗体力任务“),推送系统(提醒玩家”体力已满“)。

角色突破事件:通知UI(现实突破成功弹窗),成就系统(检测是否解锁”突破角色“成就),数据系统(更新角色的战力数值)

下面我用代码实现这些场景:

1. 定义观察者接口
创建 StaminaObserver 接口,声明观察者需要实现的方法

2. 创建被观察者
在 StaminaSystem 类中:
维护观察者列表:List<StaminaObserver> observers
提供添加/移除观察者的方法:addObserver() 和 removeObserver()
实现通知机制:notifyObservers() 方法

3. 实现具体观察者
创建具体的观察者类实现 StaminaObserver 接口:
StaminaUI 类:负责UI更新
TaskSystem 类:负责任务检测

4. 建立订阅关系
在 PlayerDataManager 构造函数中:

5. 触发通知
当 StaminaSystem 中的体力值发生变化时,调用 notifyObservers() 方法通知所有注册的观察者

6.创建test类测试:

观察者模式的优势包括:
1. 松耦合设计
降低依赖:主题(StaminaSystem)和观察者(StaminaUI、TaskSystem)之间松耦合
独立变化:可以独立修改主题或观察者,不影响对方
2. 动态订阅机制
运行时绑定:可以在程序运行时动态添加或移除观察者
灵活配置:根据不同需求订阅不同的观察者
3. 符合设计原则
开闭原则:新增观察者类型无需修改现有代码
单一职责原则:每个观察者只关注自己感兴趣的事件
4. 易于扩展和维护
功能扩展:新增通知接收方只需实现StaminaObserver接口
代码复用:观察者可以在不同主题间复用
5. 一致的更新机制
统一通知:所有观察者通过相同的接口接收更新
状态同步:确保所有相关方都能及时获得状态变化信息
这种设计使得系统更加灵活,便于维护和扩展。

2.组件模式(结构)----角色能力的复用

结合原神场景:
原神的角色能力分别有(移动,攻击,元素反应,护盾,回血)这些都是可以复用的:

钟离:有”移动+岩元素攻击+护盾+回血“组件

0命钟离的元素战技和元素爆发都不能血,6命钟离的玉璋护盾受到伤害时,将为当前角色恢复生命值,回复量为伤害的40%,单次回复量不超过当前角色最大生命值的8%。

安柏:有”移动+火元素攻击+滑翔+兔兔伯爵“组件

如果用继承,会导致类爆炸(比如”有护盾的角色“"能滑翔的角色"),组件模式将能力拆分为独立组件,动态挂载到角色上。

下面简单用代码实现一下

1. 定义组件基类
创建抽象的 CharacterComponent 基类,包含所属角色引用和更新方法:

2. 实现具体组件
创建具体的组件类继承 CharacterComponent:
ShieldComponent:实现护盾相关功能
GlideComponent:实现滑翔相关功能
每个组件负责特定的游戏功能逻辑。

3. 修改角色类
在 Character 类中添加组件管理功能:
添加组件列表:List<CharacterComponent> components
添加组件方法:addComponent(CharacterComponent component)
更新组件更新逻辑:在 update() 方法中遍历并更新所有组件

4. 建立组件关系
通过构造函数将角色实例传递给组件,并在角色中挂载相应组件:

5. 统一更新机制
在角色的 update() 方法中统一更新状态和组件,实现组件化的游戏对象管理。

1. 灵活性和可扩展性
动态组合:可以在运行时动态为 Character 对象添加或移除功能组件
易于扩展:新增功能只需创建新的 CharacterComponent 子类,无需修改现有代码
2. 代码复用性
功能共享:相同组件可在不同角色间复用(如多个角色都可使用 GlideComponent)
职责分离:每个组件专注于单一功能,提高代码内聚性
3. 降低耦合度
松耦合设计:Character 类与具体功能实现解耦
独立开发:不同组件可以独立开发和测试
4. 符合设计原则
开闭原则:对扩展开放,对修改关闭
单一职责原则:每个组件只负责一个特定功能
5. 易于维护
模块化管理:功能逻辑分散在独立的组件中
调试便利:可以单独测试和调试特定组件
相比传统的继承方式,组件模式提供了更灵活和可维护的架构设计。

ok,如果各位观众老爷觉得我讲的还不错,请给我留下一个小小的赞吧!🌂Q!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/27 13:10:22

动态规划01背包问题

动态规划:01背包问题 情景 现在有一个容量有限的背包(比如能装10公斤的东西)&#xff0c;现在有价值不同&#xff0c;重量也不同的几件物品&#xff0c;我们要怎样装才能让这个背包尽可能的装的价值最高 这就是为什么这个问题叫01背包问题&#xff0c;每个物品只有两种状态,放入…

作者头像 李华
网站建设 2026/8/27 11:32:25

WinForm DataGridView:单元格类型与高频绘制案例

目录 一、前置准备 二、DataGridView 常用单元格类型&#xff08;基础必掌握&#xff09; 1. 文本框单元格&#xff08;DataGridViewTextBoxColumn&#xff09; 2. 复选框单元格&#xff08;DataGridViewCheckBoxColumn&#xff09; 3. 下拉框单元格&#xff08;DataGridV…

作者头像 李华
网站建设 2026/8/26 9:26:17

java计算机毕业设计社区志愿者服务系统 智慧社区公益志愿协同平台 基层志愿者数字化运营管理系统

计算机毕业设计社区志愿者服务系统38q2o9 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。当“志愿红”成为社区里最温暖的底色&#xff0c;传统的人工登记、微信群接龙、纸质工时…

作者头像 李华
网站建设 2026/8/26 22:47:55

考核算法题纠错

考核题算法题纠错 打家劫舍int rob(int* nums, int numsSize) {if (numsSize 0) return 0;if (numsSize 1) return nums[0];int prev_prev nums[0];int prev nums[0] > nums[1] ? nums[0] : nums[1];for (int i 2; i < numsSize; i) {int current prev > (prev…

作者头像 李华
网站建设 2026/8/27 10:37:09

天天劈砖休闲小游戏Linux演示教程

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ 本站教程、资源皆在单机环境进行&#xff0c;仅供单机研究学习使用。 ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ 一、获取材料和结果演示 百度网盘链接: https://…

作者头像 李华
网站建设 2026/8/26 18:27:08

普中开发板基于51单片机贪吃蛇游戏设计

基于51单片机贪吃蛇游戏设计( proteus仿真程序设计报告讲解视频&#xff09; 仿真图proteus8.17(有低版本) 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;P24 1主要功能&#xff1a; 基于51单片机的贪吃蛇游戏设计 1、采用8*8点…

作者头像 李华