design-patterns - 装饰器模式;在两个抽象类下装饰具体组件

标签 design-patterns

编辑:我可以使用 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/

相关文章:

ios - 哪种模式将是创建记录的 ApiClient 实例的最佳解决方案,为所有 Controller 共享

oop - 哪些是常见的 DDD(领域驱动设计)模式?

java - 使用模板方法模式设计过滤器接口(interface)

php - 为对象交互设计类和函数

java - 共同应用接口(interface)的多个实现或条件

java - 在java中,为什么Observable的setChanged()是 protected ?

java - 单例类识别

c++ - 不同的行为取决于数据

c++ - 用于多态处理对象的 oop 设计

c++ - 扩展具有私有(private)构造函数和析构函数的单例类会给出编译时警告