有这种模式吗?

时间:2010-04-13 15:05:19

标签: design-patterns

我需要一些价值矩阵,类似于口袋妖怪:

pokemon http://firechao.com/Images/PokemonGuide/PokemonTypeChart.PNG

我有一个每个类型的类对象,有一个模式或一个很好的方法来实现它,作为中间层或在类中?

7 个答案:

答案 0 :(得分:7)

为什么要这么复杂 - 为了维护起见,让它看起来像它。 二维数组会很好,因为它是静态的,可以提供最佳的查找性能 - 然后你需要一种方法从Name / Type转到数组索引。

答案 1 :(得分:5)

是的,尝试Decorator设计模式。

提示:只需创建一个Normal类,其中包含您需要的所有统计信息。然后为每个创建一个Decorator类 矩阵的一行:FireDecoratorSteelDecorator,用于攻击/防御的乘数。

奖金#1 :您可以非常轻松地构建“Fire Steel Character”,动态(模式的意图)

奖励#2 :当你添加另一个角色时,说“巨人”,你只需添加一个类, 没有接触任何其他东西

答案 2 :(得分:3)

这是一个基本的多调度问题。不幸的是,大多数语言都不支持多次发送。

所以我可能会使用地图地图。外部地图将攻击映射到防御地图,防御地图反过来将防御映射到分数/效果/任何内容。

你可以使用访客模式,但这很快就会很麻烦。

在Python中,假设您没有使用太多的子类(例如,没有Ice的子类),您可以使用将(attack,defense)元组映射到分数的字典。这将是一个相当干净的解决方案,并且将受到各种语言的支持(你需要的只是一个Pair类,能够通过类对象或枚举等方式将攻击类型表示为对象。)

答案 3 :(得分:1)

字典使用攻击者的名称(Fire,Ice等)作为包含字典的键,该字典使用防御者的名称作为键,将倍数用作值。

答案 4 :(得分:0)

您可以使用2个地图(在java中使用地图,在其他语言中可以使用其他名称):1表示

Attacking-->DefendingDefending-->Attacking一个。

让我们考虑攻击 - >防守示例。 Map将包含攻击类型作为键,将防御类型数组作为值。例如:

火 - > [火,水,草,冰,虫,岩石,龙,钢]

答案 5 :(得分:0)

如果你为这些类型限定的每个“东西”(你的口袋妖怪或其他东西)都有一个单独的类,那么这些类可以包含一个静态哈希/地图/字典结构,它可以提供攻击其他类型的乘数。这样的散列将代表该表的一行。如果你真的需要反向查找,只需再创建一个存储信息列。

答案 6 :(得分:0)

Mediator模式可以解决问题。它更像是一个中间层解决方案,而不是一流的解决方案。

http://www.dofactory.com/Patterns/PatternMediator.aspx

  • 在上面的示例中,Colleague将是您的Type
  • ConcreteColleague0将为NormalConcreteColleague1将为FireConcreteColleague2将为WaterConcreteColleague3将为Grass {1}} ...
  • Mediator将提供方法setAttacker(Type attacker)setDefender(Type defender)fight()的界面。他们将全部ConcreteMediator中实施。这意味着类属性防御者和攻击者应该在ConcreteMediator
  • ConcreteMediator将隐藏矩阵的实现。它可以是地图的地图 - 某些语言的字典字典 - 。我也可能是一个单一的地图,其中密钥由攻击者和防御者类型的串联组成,如factor["fire_fire"] = 0.5, factor["fire_water"] = 0.5, factor["water_fire"] = 2等。如果矩阵中不存在关联,则它将获得默认因子1。获得伤害因素,可能会造成伤害。

IMO的优势在于:

  1. 如果添加新的Type,则会获得默认的损坏因子。因此,添加新类型不涉及开发,除非默认值不够。
  2. ConcreteMediator可以做的不仅仅是获得伤害因素,还可以应用它等等。
  3. 你可以发展其他ConcreteMediator - 即关系 - 而不是攻击者和后卫之间的战斗。例如steal()observe()等。如果您向调解器添加其他设置器,则关系范围将更广。