你知道在游戏开发中怎么将算法与其作用的对象隔离开来吗?

点击上方亿元程序员+关注和★星标

引言

你可能知道的设计模式-访问者模式

大家好 ,今天我们要来聊一聊 在游戏开发中非常实用 的设计模式------访问者模式 。访问者模式是一种将算法与对象结构分离 的软件设计模式,它可以让代码更加灵活、可扩展 ,同时也提高了代码的可读性和可维护性 。有什么用?让以后的你或者别人 看了你现在的代码不头疼 。那么,访问者模式在游戏开发中是如何应用 的呢?接下来就让我们一起探讨一下

本文源码和源工程在文末获取,小伙伴们自行前往。

什么是访问者模式?

访问者模式 (Visitor Pattern)是一种将算法与对象结构分离 的软件设计模式。在这种模式中,我们创建一个表示对象 的接口,让具体的类 实现这个接口,然后定义一个访问具体对象的访问者 类,让它能够调用实现接口的具体类中的方法。这样,当需要修改算法时,只需要 修改访问者类,而不需要修改具体类的结构。

访问者模式的优点

访问者模式有以下几个优点:

  • 封装了对象的操作和算法 ,使得它们可以独立于使用它的客户而变化。
  • 增加了新的操作 很容易,因为新的定义可以被添加到现有的类中,而不需要修改这些类。
  • 降低了 系统的耦合度,使得系统更具有可扩展性
  • 符合 面向对象设计原则,将算法与对象结构分离 ,提高代码的可读性和可维护性

访问者模式在游戏开发中的应用

在游戏开发中,访问者模式可以应用于以下几个方面:

  • AI行为系统 :游戏中的角色通常有很多行为,如移动、攻击、防御等。我们可以将这些行为封装成不同的类,然后通过访问者模式来组合这些行为,实现角色的AI行为。
  • 游戏事件处理 :游戏中的事件处理通常涉及到多个对象之间的交互。通过访问者模式,我们可以将事件处理的逻辑封装在一个访问者类中,从而简化事件处理的代码。
  • 游戏资源管理 :游戏中的资源管理通常涉及到多个对象的加载、卸载 等操作。通过访问者模式,我们可以将资源管理的逻辑封装在一个访问者类中,从而简化资源管理的代码。

一起来使用访问者模式

下面是一个简单的访问者模式实现示例:

1.游戏对象

首先 创建一个游戏对象类GameObject,它是不同游戏对象的基类,其中必须实现接受访问的方法accept,定义了动画组件,组件是FrameAnim序列帧动画组件,用于管理和播放 角色的序列帧动画 ,大家可以通过文章《CocosCreator帧动画组件FrameAnim实现与使用》学习。

2.具体游戏对象

然后 我们实现两个具体的游戏对象,都实现访问者接口accept。在被访问者访问的时候进行攻击。

3.访问者

最后定义一下访问者接口,并且实现一个具体的访问者,去访问我们的游戏对象。

4.测试代码

首先我们又双叒叕 创建2个游戏对象ConcreteGameObjectAConcreteGameObjectB,一左一右,添加"皮肤"。

然后分别给2个游戏对象添加一下点击事件 ,并且创建一个具体的访问者ConcreteVisitor,通过点击对应的游戏对象去访问他们。

5.结果演示

当我们分别点击不同的游戏对象时,对象会进行皮肤的加载并且进行攻击。

在这个示例中,我们将游戏对象的访问算法(ConcreteVisitor类中的方法)与不同类型的游戏对象(ConcreteGameObjectAConcreteGameObjectB)分离开来。这使得我们能够轻松地为游戏对象和访问算法添加新操作 ,而不需要修改游戏对象的代码,保持了代码的可维护性和可扩展性。这正是访问者模式的强大之处

结语

在哪里 可以看到如此清晰的思路,快跟上我的节奏!关注我 ,和我一起了解 游戏行业最新动态,学习游戏开发技巧。

本系列是《和8年游戏主程一起学习设计模式》,让糟糕的代码在潜移默化中升华,欢迎大家关注分享收藏订阅。

我是"亿元程序员",一位有着8年游戏行业经验的主程。在游戏开发中,希望能给到您帮助, 也希望通过您能帮助到大家。

AD:笔者线上的小游戏《贪吃蛇掌机经典》《重力迷宫球》《填色之旅》大家可以自行点击搜索体验。

实不相瞒,想要个在看 !请把该文章分享给你觉得有需要的其他小伙伴。谢谢!

推荐专栏:

8年主程手把手打造Cocos独立游戏开发框架

从零开始开发贪吃蛇小游戏到上线系列

游戏开发的技巧、心得、资讯

关注我,发送"访问者模式"获取源码和源工程。

点击下方绿色按钮+关注

相关推荐
lyyl啊辉5 分钟前
2. Vue数据双向绑定
前端·vue.js
CappuccinoRose1 小时前
CSS 语法学习文档(十七)
前端·css·学习·布局·houdini·瀑布流布局·csspaintingapi
keyborad pianist1 小时前
Web开发 Day1
开发语言·前端·css·vue.js·前端框架
Never_Satisfied1 小时前
在HTML & CSS中,可能导致父元素无法根据子元素的尺寸自动调整大小的情况
前端·css·html
We་ct1 小时前
LeetCode 101. 对称二叉树:两种解法(递归+迭代)详解
前端·算法·leetcode·链表·typescript
码云数智-大飞1 小时前
微前端架构落地实战:qiankun vs Module Federation 2026 深度对比与选型指南
前端·架构
IT枫斗者1 小时前
MyBatis批量插入性能优化:从5分钟到3秒的工程化实践
前端·vue.js·mysql·mongodb·性能优化·mybatis
前端 贾公子2 小时前
深入理解 Vue3 的 v-model 及自定义指令的实现原理(中)
前端·html
Never_Satisfied2 小时前
在HTML & CSS中,img标签固定宽度时,img和图片保持比例缩放
前端·css·html
Cache技术分享2 小时前
327. Java Stream API - 实现 joining() 收集器:从简单到进阶
前端·后端