design-patterns - 我应该使用什么设计模式?不同的类,相同的静态行为
问题描述
我正在开发一款 RPG 视频游戏。正如你在大多数 RPG 中所做的那样,如果你想要一个干净的界面,你会尝试在与玩家特别相关时突出显示某些文本。
例如,每次我想说“这次攻击造成 30 点寒冷伤害”时,我都会有这样的字符串:
“这次攻击造成 $VALUE$。”
然后$VALUE$将被实时替换为"30 [ICON] Cold Damage":
- [ICON] 将是寒冷伤害类型的图标(例如蓝色雪花)。
- 数字(在本例中为 30)将以粗体显示。
- “Cold Damage”这个词会有浅蓝色的阴影。
这一切都已经完成,并且运行良好。然而,随着更多效果、技能、攻击类型和角色的添加,我的代码变得臃肿不堪。现在,我的字符串解析器有一堆静态方法,比如:
public static string ColdDamage(int amount)
{
return <a formatted string for cold damage>
}
事情是这样的:攻击类型遵循这种格式。技能、效果、武器以及介于两者之间的所有东西也是如此,包括角色(我们展示了一个小肖像并突出显示了名称)。
================================
话虽如此,这是我的(可能的)解决方案:
我改变了我的 StringsParser 类,所以我可以这样做:
public static string FancyUpMyText(int amount, string text, string colorHex, string iconRef)
{
return <a formatted string for anything you want>
}
但是,看看这 4 个参数。这将严重混淆代码。更不用说并非所有内容都遵循相同的格式。有时,我想说“30 [ICON] 冰冷伤害”。有时是“[ICON]攻击+10”。我需要一个更具体的解决方案,否则我最终会得到 15 个方法,每个方法都有一堆参数,所有这些方法在它们庞大的、臃肿的返回语句中只有微小的变化。
或者,我可以添加一个“IFancyDisplay”接口并让它们都实现它。但是,我需要方法是静态的,因为我们已经使用了访问者模式来处理许多情况,而且我并不总是在所有情况下都可以使用整个对象的信息。使用“ClassDamageCold.GetFancyText(30);”会很棒,但我不能在接口上创建静态方法
所以,作为这个 C#,多重继承是不可能的,并且有这么多分散在代码中的元素应该共享一个共同的行为......
有什么我可以使用的模式,或者我的 StringsParser 会膨胀到被遗忘吗?
注意:有些对象会有多种方法(例如“Health +30”和“15% Health”),因此这里的访问者可能不是最佳选择。如果可以的话,我会创建多个接口(IFancyDisplayPercentage、IFancyDisplayInteger、...),每个接口都有 1 个方法,并根据每个类的需要实现它们。
请帮忙 :)
非常感谢您!
解决方案
推荐阅读
- python - 格式化 Python Fabric 输出
- excel - Excel与索引/匹配最接近的匹配
- powershell - 如何优化跨所有域控制器的查询以找到最新的登录日期?
- security - 使用 Ory/Kratos 登录/注册 API 流程
- javascript - JavaScript:在给定索引列表的多维数组中获取元素
- flutter - Flutter 使用 path_provider 包获取外部存储目录和 MediaStore
- ios - SwiftUI - 详细视图更改为 @fetchRequest 弹出导航链接视图
- css - 尝试对标题中的两个不同单词进行悬停效果
- python - 使用 .onnx 模型的 OpenCV(Ptyhon)的 DNN 模块中的前向方法错误
- c# - 使用 Audit.NET 和 C# 的基本 WebApi 实现:错误 EntityFrameworkCore.Internal.EnumerableExtensions