UE开发中的设计模式(四) —— 组合模式

面试中被面试官问到组合模式和继承有什么区别,给我问懵了,今天又仔细看了下,这不就是UE里的组件吗 >_<


文章目录

  • 问题提出
  • 概述
  • 问题解决
  • 总结
    • 组合模式的优缺点
    • 继承的优缺点


问题提出

考虑这样一个场景,我们有一个敌人的基类,其包含一些公有的属性和方法,比如他有一个Mesh(Static Mesh/Skeletal Mesh),他在世界空间中有一个位置,他可以攻击我们的玩家。然而对于不同类型的敌人,他可能有自己独特的属性和方法,比如有些怪可以给己方加血,有些怪会飞,有些怪会上buff…

一种常见的设计方法是通过继承实现。

从上面的UML图可以看出,EnemyClassA 可以飞,可以上buff,EnemyClassB 可以上 buff,可以治疗队友,EnemyClassC 可以治疗队友,可以飞。想象一下,如果再有一个新的方法,比如可以隐身,那么可能又会产生三个新的基类(考虑两种独有的方法),但其实完全不必要,因为fly,buff,treat明显是重复实现了好多次。

那么有什么办法可以解决这个问题吗。


概述

这时候就需要组合模式闪亮登场了,组合模式通过少继承多组合的方式,可以提高代码复用,且我们想给一个类增加一个新功能,直接给他加一个组件就行了,很方便。

在UE/Unity里也是用了组件,比如UE里的移动组件,网格组件,摄像机组件,一个Actor可以说是一个组件的容器,组件给Actor提供了各种技能。

且组件也支持嵌套,即组件可以包含很多的子组件,比如UE里的USceneComponent,其有一个AttachParent为父节点,还有一个AttachChildren保存多个子节点,明显是一个树形结构。这种设计哲学,感觉更像是这些组件组合起来,成为了一个我们想要的类,而不是像继承一样,通过分类的方式,子类相较于父类多了什么。


这种设计模式也很适合用来设计UI,UI本身也可以看作一个树形结构,每一个组件提供了一些功能,其下也能包含其它的一些小的组件。


问题解决

我们用组合的方式来解决一开始敌人的场景问题,我们可以有飞行组件、治疗组件、加buff组件,那么对于一个具体的敌人,我们只需要添加对应的组件即可。

这个场景比较简单,且有明显的继承关系,个人感觉其实用继承更合适。但其实好多类他们没有继承关系,比如玩家和敌人,没有明显的继承关系,但都可以行走,那么完全可以独立出一个移动组件,而UE本身也是这么做的。

而且组合模式,可以动态地增减节点,对应的就是增加/减少功能,更加灵活(更低的耦合)。比如玩家捡到一把枪,那么玩家就获得了开火射击的技能。枪也相当于组件挂载到玩家这个整体组件的树形结构上。


总结

组合模式的优缺点

优点:

  • 灵活性高: 组合模式允许在运行时动态地改变对象的行为,比继承这种在编译时确定的机制更为灵活。

  • 减少耦合: 通过组合,类与类之间的关系可以保持松散耦合,有利于系统的可维护性和可扩展性。

  • 更好的代码复用: 对象可以通过组合不同的小对象来获得新的功能,而不需要从基类继承所有的实现。这有助于代码模块化和复用。

  • 更容易进行单元测试: 由于组合的各个组件是分离的,这些组件可以单独进行测试,简化了测试过程。

  • 避免继承层次复杂: 大量使用继承可能导致复杂的继承层次结构,使得系统难以理解和维护。组合模式通过简单组合对象,避免了这个问题。

缺点:

  • 复杂性增加: 组合模式可能会导致系统设计复杂化,因为需要管理更多的对象和对象关系。

  • 接口定义可能复杂: 为了支持组合,各个组件之间需要定义良好的接口。这些接口的定义和维护可能会比较复杂。

继承的优缺点

优点:

  • 直接性: 继承是直观的、简单的,特别是在机制已经被明确时。它允许一个类自动获得另一个类的属性和方法。

  • 基础实现共享: 继承允许子类共享从基类继承的代码,因此可以较容易实现代码复用。

  • 一致性: 通过继承可以确保子类与父类之间的一致性,子类可以覆盖或扩展父类的方法。

缺点:

  • 灵活性较差: 继承的关系在编译时已经确定,因此运行时无法进行动态行为改变。

  • 高耦合: 继承会导致子类和父类之间的紧耦合关系,增加了系统变化的难度。如果父类发生变化,可能会影响所有子类。

  • 继承层次复杂难以管理: 继承层次过深时,会导致代码维护困难,理解和管理的成本增加。

  • 单继承的限制: 在不支持多重继承的语言中,继承会限制一个类只能从一个父类继承,限制了类之间的关系构建。

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

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

相关文章

武器弹药制造5G智能工厂物联数字孪生平台,推进制造业数字化转型

武器弹药制造领域作为国防工业的重要组成部分&#xff0c;其数字化转型更是关乎国家安全与军事实力提升的关键。随着5G、物联网、大数据、云计算及人工智能等先进技术的融合应用&#xff0c;武器弹药制造5G智能工厂物联数字孪生平台应运而生&#xff0c;正逐步成为推进制造业数…

程序设计—智慧城市应急物资配送系统开发—大数据模块 项目源码36262

摘 要 智慧城市应急物资配送系统开发中的大数据模块&#xff0c;作为核心的数据处理与分析组件&#xff0c;实现了数据可视化、用户行为分析、精准广告推送、数据报表生成以及商品与需求信息的全面管理。 该模块通过数据地图展示大屏&#xff0c;实时呈现应急物资配送的层级联…

【STM32】电容触摸按键

电容按键就是酷&#xff0c;但据我使用过电容按键版的洗澡计费机子后&#xff0c;一生黑&#xff08;湿手优化没做好的电容按键简直稀碎&#xff09;。 大部分图片来源&#xff1a;正点原子HAL库课程 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目录 1 触摸按…

Python 如何操作 Excel 文件(openpyxl, xlrd)

Python是处理Excel文件的一种非常强大且灵活的工具&#xff0c;尤其是通过使用openpyxl和xlrd等库。openpyxl专注于Excel 2007及更高版本的.xlsx文件的创建、读取、修改和写入&#xff0c;而xlrd则主要用于读取早期版本的Excel文件&#xff08;.xls&#xff09;&#xff0c;但自…

【教你一键解决】draw.io中输入英文显示成中文且输入位置移到首位

问题描述&#xff1a;当英文输入一个“a”时&#xff0c;会自动出现中文“一个”&#xff0c;再输入“a”才会出现“a”&#xff0c;删除时无法把中文删除&#xff0c;如下图所示。 解决方法&#xff1a;关闭浏览器的自动翻译功能即可&#xff0c;如下图所示。

HTTPS协议中的加密机制分析、证书认证

目录 一、为什么要对数据进行加密&#xff1f; 二、什么是加密和解密&#xff1f; 三、加密方式 对称加密 非对称加密 四、数据摘要(数据指纹) 五、数字签名 六、探究保证双方通信安全的的加密方案 1、只使用对称加密 2、只使用非对称加密 3、双方都是用非对称加密 …

怎么理解数据资源、数据资产和数据要素?

身处信息化时代&#xff0c;我们每时每刻都在产生和接触各类数据&#xff0c;如网购记录、短视频等。在我国数据安全法中将数据定义为任何以电子或其他方式对信息的记录。即数据不仅指数字表格等结构化内容&#xff0c;也可以是文字、图形、图像等半结构化、非结构化信息。 1、…

航空制造领域中三维工艺技术的应用

飞机制造企业可以通过三维数字化技术的应用有效提升了工艺设计水平&#xff0c;解决了在航空产品数字化工艺设计、制造方面的标准统一和系统整合等问题&#xff0c;保证了业务应用系统基础数据的一致性和规范性。本文是对航空制造领域中三维工艺技术的应用的介绍。 随着信息化技…

安装JKS格式证书

--千金易得 知己难求 本文介绍如何在Tomcat服务器配置JKS格式的SSL证书&#xff0c;具体包括下载和上传证书文件&#xff0c;在Tomcat上配置证书文件和证书密码等参数&#xff0c;以及安装证书后结果的验证。成功配置SSL证书后&#xff0c;您将能够通过HTTPS加密通道安全访问To…

ffmpeg教程及加速视频转码

ffmpeg教程及加速视频转码 1、ffmpeg简介&#xff1a; ffmpeg来自MPEG视频编码标准。 是一套可以用来记录&#xff0c;转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。 可以轻易的实现多种视频格式之间的相互转换。 2、基础知识&#xff1a; 容器、文件…

FDM3D打印系列——创想三维打印机卡料修复后续处理

大家好&#xff0c;我是阿赵。   之前我的创想三维Sermoon v1打印机卡料了&#xff0c;我自己拆开打印头组件&#xff0c;把卡料的地方修复了。   但问题并没有彻底的解决。在后续打印之中&#xff0c;还是经常出现卡料。有些需要打印实际个小时的模型&#xff0c;在打印了…

基于Material Design风格开源的Avalonia UI控件库

前言 今天大姚给大家分享一款基于Material Design风格开源、免费&#xff08;MIT License&#xff09;的Avalonia UI控件库&#xff1a;Material.Avalonia。 当前项目还处于alpha阶段。 Avalonia介绍 Avalonia是一个强大的框架&#xff0c;使开发人员能够使用.NET创建跨平台应…

内网穿透的应用-如何使用跨平台终端Tabby结合内网穿透工具异地远程ssh访问Ubuntu系统

文章目录 前言1. Tabby下载安装2. Tabby相关配置3. Tabby简单操作4. ssh连接Linux4.1 ubuntu系统安装ssh4.2 Tabby远程ssh连接ubuntu 5. 安装内网穿透工具5.1 创建公网地址5.2 使用公网地址远程ssh连接 6. 配置固定公网地址 前言 今天和大家分享一下如何在Windows系统使用Tabb…

Trimming项目完整流程

Trimming项目完整流程 FsmStates状态机 public enum FsmStates {// 初始状态&#xff0c;FSM 启动后的第一个状态Initial,// 等待序列化过程控制器&#xff08;SPS&#xff09;启动的状态// 在此状态下&#xff0c;FSM 等待外部系统或设备准备就绪WaitOnSPSStart,// 加载数据库…

【使用python实现多目标批量ping】附案例

以下为使用 Python 实现批量 ping 的多种方法及代码示例&#xff1a; 方法一&#xff1a; import subprocessfilepath E:\\Python\\tools\\AutoMatic\\hosts.txt with open(filepath, r) as f:hosts f.readlines()for host in hosts:result subprocess.check_output((ping…

C语言典型例题55

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 题目&#xff1a; 例题4.7 兔子的繁殖。这是一个有趣的古典问题&#xff1a;有一对兔子&#xff0c;从出生后的第3个月开始起每个月都生一对兔子。小兔子长到第3个月又生一对兔子。假设所有兔子都不死&#xff0c;…

大模型的latency(延迟)和throughput(吞吐量)有什么区别?

1. 导入 为了快速应用大模型&#xff0c;我们需要采购商业大模型。采购前&#xff0c;对接销售时&#xff0c;我们描述了我们的场景和需求&#xff1a; Q&#xff1a;我们的prompts token数量在1500-2000之间&#xff0c;completion token数量在500左右。这种情况下&#xff…

同三维S20和S20K系列高清和4K摄像机说明书:高清HDMI摄像机

同三维S20和S20K系列高清和4K摄像机 视频会议摄像机概述前言 非常感谢您使用本公司视频会议产品!在使用本产品之前&#xff0c;敬请仔细阅读使用手册。本手册详细介绍了多功能视频会议摄像机的功能、安装和使用操作的一般原则及方法。本系列视频会议摄像机是一款高性能、高灵敏…

设计模式 -- 外观模式(Facade Pattern)

1 问题引出 组建一个家庭影院 DVD 播放器、投影仪、自动屏幕、环绕立体声、爆米花机,要求完成使用家庭影院的功能&#xff0c;其过程为&#xff1a; 直接用遥控器&#xff1a;统筹各设备开关 开爆米花机&#xff0c;放下屏幕 &#xff0c;开投影仪 &#xff0c;开音响&#xf…

【云原生】Kubernetes中如何通过Pod名称查询Docker容器ID,通过Docker容器ID查询Pod名称?

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…