编辑:我可以使用Actionscript 3.0和/或Java
我对装饰器类有点问题。我希望能够装饰抽象类的子类的子类。
澄清;我有abstract weapon class
,abstract 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"
答案 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基类或接口,然后为每个结界创建具体的类。然后在每个对象中,有一个每个类/接口的修饰符列表,并根据需要运行它们,比如计算损坏。
最接近的类似模式是策略或模板方法。
我已经在脑海中将您的问题翻译为“如何实施暗黑破坏神游戏中使用的项目修饰系统?”。有许多问题需要考虑 - 保存和恢复状态以及修饰符之间的交互,现在只有两个。