【发布时间】:2023-03-07 10:55:01
【问题描述】:
对不起,冗长的例子,但我最近遇到了这种类型的软件设计问题,并且一直在思考它。不确定是否有一个术语,所以我将给出 2 个通用示例来给出一个想法:
示例 1:您正在开发一款 RPG 游戏,并且为主角设置了一个课程。该角色对游戏世界的反应会根据您所穿/持有的物品、分配的技能,基本上是您对象的内部状态而变化。
假设你在游戏中有以下物品:
- 再生之戒:让你的角色随着时间的推移恢复生命值
- 偷偷摸摸的运动鞋:增加偷偷摸摸
- 魔镜:反射受到伤害的百分比
- 傻瓜眼镜:突出制作资源
示例 2:您有一辆丰田卡罗拉。它有不同的配置,但它们都是丰田卡罗拉。 ABS 和牵引力控制是您可以添加到基准模型中的可选功能(行为)。
- 基线模型在运行时没有做任何额外的事情。
- 借助 ABS,汽车在行驶时会检查并响应突然停止
- 借助牵引力控制,汽车在行驶时会检查并响应失去的牵引力
- 很明显,当您拥有一辆同时具备这两种行为的汽车时,您将在汽车行驶时同时执行这两种行为。
两个例子的共同属性:
- 重要性等级有一个具体的白板,它可以从它开始
- 可选项目/部件可以为该对象添加能力或额外行为;每场比赛/在运行时做一些额外的事情
- 在添加或删除项目/行为时可能会或可能不会改变对象(穿上运动鞋时增加潜行,脱下时减少它)
可能的解决方案(但不充分):
if 语句:
if ch.isWearing 'doofy glasses':
render with doofy shader
else if ch.isWearing ...
不起作用。需要为每个部分添加一个子句。类会很快变得庞大而复杂。
策略模式:
class TractionControlStrategy
class ABSstrategy
class Toyota:
TractionControlStrategy tcs
ABSstrategy abs
run():
if tcs not null:
tcs.run()
if abs not null:
abs.run()
carWithTCS = new Toyota(new TractionControlStrategy())
没有比之前的解决方案好多少,因为您仍然有很长的 if 语句列表
子类策略:
class Toyota:
run():
// does nothing
class ToyotaWithABS : Toyota
ABSstrategy abs = new ABSstrategy()
run():
abs.run
class ToyotaWithTCS : Toyota ...
我认为满足开放/封闭原则。也许比上一个更好?但是现在您必须为每种配置组合创建一个类。如果您后来发现还有其他可选功能,那么您需要实现的每个功能的类数量都会翻倍......
如何使用 OOP 对这些类型的交互和行为进行建模?什么样的设计模式或设计模式的组合促进了这种事情?
真的不确定这是否是一个好问题,或者我是否清楚我在问什么,因为我从未真正练习过好的软件设计。
我正在学习 OpenGL,正在研究我的 3D 网格/模型类。这个问题是相关的,因为在我的渲染器中,索引和纹理对于网格来说是可选的。所以一个网格只能是顶点,索引顶点,顶点和纹理,或全部3个。另外,我无法预见将来我可能想要添加哪些功能,因为我不知道我会像学习一样学习什么一个月后,所以我需要课程灵活且可扩展
【问题讨论】:
标签: oop design-patterns game-engine