2

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

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

澄清; 我有abstract weapon class,abstract sword class扩展。然后,最后 aconcrete 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"
4

2 回答 2

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()
}}

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

于 2012-04-08T10:51:29.550 回答
1

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

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

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

假设您受到静态语言的限制,我的建议是:对于您想要的每种附魔,创建一个修饰符基类或接口,然后为每个附魔创建具体类。然后在每个对象中,列出每个类/接口的修饰符,并根据需要遍历它们,例如计算伤害。

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

我已将您的问题翻译为“如何实现暗黑破坏神游戏中使用的物品修改系统?”。有很多问题需要考虑——保存和恢复状态,以及修饰符之间的交互,只是我现在想到的两个。

于 2012-04-08T11:05:31.403 回答