【发布时间】:2013-11-27 09:58:55
【问题描述】:
我正在为我的学习开发一款 RPG 游戏,我们需要使用设计模式,并且我正在尝试编写动态角色技能。例如,我会有一些物品,当装备时,会添加角色以前没有的新技能(治疗......)。
为此,我想使用装饰器模式,但是有了这个,我们不能给一个类添加方法或属性,只需要修改那些已经存在的,对吧?
那么有没有动态的方法来做到这一点?
【问题讨论】:
标签: java design-patterns
我正在为我的学习开发一款 RPG 游戏,我们需要使用设计模式,并且我正在尝试编写动态角色技能。例如,我会有一些物品,当装备时,会添加角色以前没有的新技能(治疗......)。
为此,我想使用装饰器模式,但是有了这个,我们不能给一个类添加方法或属性,只需要修改那些已经存在的,对吧?
那么有没有动态的方法来做到这一点?
【问题讨论】:
标签: java design-patterns
那里有很多模式;你的老师有没有要求一个特定的模式或一组模式?此外,模式有时是有意义的。仅在它们有助于解决问题时才使用它们,而不是因为它们很酷。
在这种情况下,可以使用装饰器。在您编写时,它们不应该添加外部方法或属性。所以你需要getHealingPower(),getArmorValue() 等等,即使是裸体角色;每个包装的装饰器都会修改它关心的东西的返回值:HealingBookDecorator 将返回wrappedObject.getHealingPower() + 15。然而,我觉得他们在这个场景中很丑,因为角色无法移除治疗书以将其留在地板上,或者拿起一本更好的书。装饰对象通常不知道它们的装饰器。另外,如果你的角色被命名为bob,那么给他穿上StripedShirtDecorator(RedScarfDecorator(PolkaDotTrousersDecorator(bob)))会很奇怪。
如果我必须实现这一点,每个Item 都会有一个String description 并包含一个Map<Stat, Integer> modifiers(其中Stat 是一个enum 的有效统计数据,例如治疗、护甲值、最大HP、等等)。一个Character 将有一个ArrayList<Item> inventory,一个Map<Stat, Integer> baseStats 他或她的基本统计数据,另一个Map<Stat, Integer> currentStats 将包含合并baseStats 和modifiers 的每个modifiers 在字符'库存,并且每次角色升级或从库存中添加或删除某些东西时都需要更新。
要检查名为lisaSimpson 的Character 中Stat.MusicProficiency 的级别,您可以编写lisaSimpson.getStat(Stat.MusicProficiency);。这样做的好处是很容易添加新类型的项目(它们将是对象实例,而不是类),并且库存管理将大大简化。
【讨论】: