编辑:我可以使用 Actionscript 3.0 和/或 Java
我对装饰器类有一些问题。我希望能够装饰抽象类的子类的子类。
澄清;我有抽象武器类
,它是抽象剑类
的扩展。然后,最后一个具体的长剑类
扩展了它。我希望能够装饰长剑类
。
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"
最佳答案
在 Java、C++ 和(我认为)C# 等静态语言中,您无法为类创建装饰器并使用它来装饰该类的子类。好吧,你可以,但效果是隐藏子类的功能。
我猜你想要的是能够混合搭配装饰器,其中每个装饰器都可以用于对象的类或其祖先之一。
在动态语言中,例如 Perl 和 ruby,您可以定义或重新定义单个对象的单独方法,理论上您可以使用它来对子类进行装饰。
假设您受到静态语言的限制,我的建议是:对于您想要拥有的每种魔咒,创建一个 Modifier 基类或接口(interface),然后为每个魔咒创建具体的类。然后在每个对象中,有每个类/接口(interface)的修饰符列表,并根据需要运行它们以计算伤害。
最接近的类似模式是策略或模板方法。
我已经将你的问题翻译成“如何实现暗黑破坏神游戏中使用的元素修改系统?”。有很多问题需要考虑 - 保存和恢复状态,以及修改器之间的交互,只是我现在想到的两个问题。
关于design-patterns - 装饰器模式;在两个抽象类下装饰具体组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10062111/