Design patterns 装饰设计模式问题

Design patterns 装饰设计模式问题,design-patterns,Design Patterns,我正在为使用decorator模式的正确性而挣扎。 让我们以暗黑破坏神2游戏为例。有一些物品(例如)剑,你可以用珠宝装饰,剑会发生变化,例如更多的攻击点或剑名修改。因此,从这个角度来看,剑是一个可以装饰的具体物体,而珠宝是装饰者。但珠宝也可以作为独立的物品保留下来,它们还具有名称、描述和其他指定符。如何解决这个问题?我希望有一个独立的“宝石”,可以得到他的名字,描述,但我也可以用这个杰维尔装饰一些剑。请注意,jevel和Swarm都有共同的说明符,如独立的名称或描述。当用jevel装饰剑时,剑必

我正在为使用decorator模式的正确性而挣扎。
让我们以暗黑破坏神2游戏为例。有一些物品(例如)剑,你可以用珠宝装饰,剑会发生变化,例如更多的攻击点或剑名修改。因此,从这个角度来看,剑是一个可以装饰的具体物体,而珠宝是装饰者。但珠宝也可以作为独立的物品保留下来,它们还具有名称、描述和其他指定符。如何解决这个问题?我希望有一个独立的“宝石”,可以得到他的名字,描述,但我也可以用这个杰维尔装饰一些剑。请注意,jevel和Swarm都有共同的说明符,如独立的名称或描述。当用jevel装饰剑时,剑必须成为一个新名称,例如“带紫水晶的剑”,当获得独立紫水晶的名称时,它应该返回一个旧紫水晶“.有什么想法吗?

珠宝不应该是装饰物,因为它们不代表相同的功能,即剑。但是,您可以使用
带宝石的剑
,也可以使用伪代码:

interface ISword { Stab(); }
class Sword : ISword { Stab();  }
class SwordWithJewels : ISword { Stab(); }
SwordWithJewels
在构建过程中,应该直接或间接地通过拥有珠宝的另一个对象将珠宝作为参数,并使用该信息计算命中强度或名称或任何您需要的信息


但请注意,这只是一个选项,根据上下文的不同,可能会有些过分。如果你认为珠宝是一个库存物品,那么使用其他方法可能会更有意义(我故意避免这个词模式)从“我需要使用一些模式”经常导致坏代码开始。只需遍历库存物品列表,让每个物品在命中时添加或删除力量点也有意义,这更类似于访客(如果你想要一个熟悉的名字)。

珠宝不应该是装饰物,因为它们不代表相同的功能,即剑。但是,您可以使用
带宝石的剑
,也可以使用伪代码:

interface ISword { Stab(); }
class Sword : ISword { Stab();  }
class SwordWithJewels : ISword { Stab(); }
SwordWithJewels
在构建过程中,应该直接或间接地通过拥有珠宝的另一个对象将珠宝作为参数,并使用该信息计算命中强度或名称或任何您需要的信息


但请注意,这只是一个选项,根据上下文的不同,可能会有些过分。如果你认为珠宝是一个库存物品,那么使用其他方法可能会更有意义(我故意避免这个词模式)从“我需要使用一些模式”经常导致坏代码开始。只需遍历库存项目列表,并让每个项目在点击中添加或删除优势点也有意义,这更类似于visitor(如果您想要一个熟悉的名称).

在这种情况下,剑能否构成宝石?嗯,在拥有原始剑的情况下,用宝石构建新实例剑是个坏主意,因为剑应该始终是相同的原始实例。如果我想在那里放置一颗宝石,我不会创建一把新剑,并将所有其他剑的属性从“剑”复制到“带宝石的剑”。我认为它扰乱了面向对象编程的概念,你不这样认为吗?一把剑应该永远是同一把剑,有没有珠宝。其次,当创建一个新的SwordWithJewels实例时,程序处理两个不同的剑实例,而在游戏中应该只存在一个。这就是decorator模式的要点:让一个对象包装另一个对象,并使用增强的功能公开相同的接口。这也是我暗示这里的装饰师不是一个好选择的原因。不要为了符合文献而选择模式。当它们有意义的时候就使用它们。对不起,我不明白你的答案,你能更详细地重复一下吗?在我的previos帖子中,我谈论的是您使用“剑”和“带宝石的剑”的解决方案,而不是decorator模式,因此我看不出与我的上一篇帖子和您的上一个答案有任何联系。您提到有两个对象等-decorator是关于包装对象的,因此您将有多个实例在它们之间转发调用。虽然你在最后的评论中没有提到,但你的问题的标题是“装饰者…”。连接是你不能考虑多个对象坏主意,而仍然是在装饰的主题。也就是说,多个对象没有问题-它们只在构建时可见,之后客户只处理一个对象。在这种情况下,
可以组合宝石吗?嗯,在拥有原始剑的情况下构建一个新实例剑是个坏主意,因为剑应该永远是一样的,原样。如果我想在那里放置一颗宝石,我不会创建一把新剑,并将所有其他剑的属性从“剑”复制到“带宝石的剑”。我认为它扰乱了面向对象编程的概念,你不这样认为吗?一把剑应该永远是同一把剑,有没有珠宝。其次,当创建一个新的SwordWithJewels实例时,程序处理两个不同的剑实例,而在游戏中应该只存在一个。这就是decorator模式的要点:让一个对象包装另一个对象,并使用增强的功能公开相同的接口。这也是我暗示这里的装饰师不是一个好选择的原因。不要为了符合文献而选择模式。当它们有意义的时候就使用它们。对不起,我不明白你的答案,你能更详细地重复一下吗?在我的previos帖子中,我谈论的是您使用“剑”和“带宝石的剑”的解决方案,而不是装饰器模式,因此我看不出与我的上一篇帖子和您的上一个答案有任何联系。您提到有两个对象等-装饰器是关于包装对象的,因此您将有多个实例转发c