2013-04-14 26 views
1

我正在努力使用装饰模式的正确性。 让我们以Diablo 2游戏为例。有些东西(例如)剑,你可以装饰珠宝和剑变得更多,例如更多的攻击点或剑名称修改。因此,在这个角度来看,剑是一个具体的物体,将被装饰,珠宝是装饰者。但珠宝也可以保持独立,独立的物品,他们也有名称,描述和其他说明。如何解决这个问题?我会有一个独立的'珠宝',并且可以得到他的名字,描述,但是我也可以用这个宝石来装饰一把剑。请注意,双方的剑和剑都有独立的名称或描述等通用说明符。在装饰剑的同时,剑也必须成为一个新的名字,例如“紫水晶剑,同时得到独立紫水晶的名称,它应该返回”一个古老的紫水晶。“任何想法?室内设计师设计模式问题

回答

1

珠宝不应该是装饰者他们并不代表相同的功能,即剑然而,你可以有SwordWithJewels,或在伪代码:

interface ISword { Stab(); } 
class Sword : ISword { Stab(); } 
class SwordWithJewels : ISword { Stab(); } 

SwordWithJewels通过拥有另一个对象应该大概需要珠宝施工过程中的参数,直接或间接地他们,并使用该信息来计算命中强度或名称或任何你需要的。

但请注意,这只是一个选项,可能会根据上下文来矫枉过正。如果你认为珠宝是一个库存项目,那么使用其他方法可能会更有意义(我故意避免使用“我需要为此使用某种模式”这一想法开始的单词模式通常会导致代码不正确)。只要遍历清单项目清单,并让它们每个添加或删除点击中的强度点也是有意义的,这更类似于访问者(如果你想要一个熟悉的名字)。

+0

在这种情况下,“剑”可以组成珠宝吗? – Ejaz

+0

构成不了,总计也许...... –

+0

关于构建新实例的嗯关于有原始剑的情况下的剑有一个坏主意,因为剑应该永远是同一个原始实例。如果我想在那里放置一颗宝石,我不会创造一把新剑,并将所有其他剑属性从'剑'复制到'SwordWithJewels'。我认为它打乱了面向对象的编程概念,你不觉得吗?一把剑应该永远是同一把剑的例子,有或没有珠宝。其次,当创建一个新的SwordWithJewels实例时,该程序处理2个不同的剑实例,而在游戏中应该只存在一个 – friko