装饰图案;在两个抽象类下装饰具体组件

时间:2012-04-08 10:29:55

标签: design-patterns

编辑:我可以使用Actionscript 3.0和/或Java

我对装饰器类有点问题。我希望能够装饰抽象类的子类的子类。

澄清;我有abstract weapon classabstract sword class延伸。然后,最后concrete long sword class扩展它。我希望能够装饰long sword class

                                   Weapon <-------------Enchant "Decorator
                                     /\                  /   \
                                    /  \        "+3 damage"|"Paralyze"
                                   /    \                  V
"Abstract Components":       Sword    |    Axe    "Concrete Decorators" 
                              / \         /    \
                             /   \       /      \
"Concrete Components": LongSword|Short RedAxe| WarAxe "Apply Decorators Here"

目前我读过的关于设计模式的所有书籍都涉及“一层”装饰,例如:

                                        Weapon <-------------Enchant "Decorator
                                         /\                  /   \
                                        /  \        "+3 damage"|"Paralyze"
                                       /    \                  V
  "Concrete components already":    Sword | Axe      "Concrete Decorators"

2 个答案:

答案 0 :(得分:1)

public abstract class weapon
{
list WeaponDecorator decorators;
hit()
{for each decorator in decorators {
 decorator.hit();}}
}

public abstract class axe : weapon
{hit()}

public class broadaxe : axe
{hit(){
parent.hit();    
implementation;}}

public class WeaponDecorator : weapon
{hit(){
 implement freeze()
}}

如果我理解你的图表,这应该是伪代码的实现。

答案 1 :(得分:1)

在Java,C ++和(我推测)C#等静态语言中,您无法为类创建装饰器并使用它来装饰该类的子类。嗯,你可以,但效果是隐藏子类的功能。

我想你想要的是能够混合和匹配装饰器,其中每个装饰器可以用于对象的类或其祖先之一。

在动态语言中,例如perl和ruby,您可以定义或重新定义单个对象的单个方法,理论上您可以使用它来执行子类上的装饰。

假设你受到静态语言的限制,我的建议如下:对于你想拥有的每种结界,创建一个Modifier基类或接口,然后为每个结界创建具体的类。然后在每个对象中,有一个每个类/接口的修饰符列表,并根据需要运行它们,比如计算损坏。

最接近的类似模式是策略或模板方法。

我已经在脑海中将您的问题翻译为“如何实施暗黑破坏神游戏中使用的项目修饰系统?”。有许多问题需要考虑 - 保存和恢复状态以及修饰符之间的交互,现在只有两个。