我很难理解Erich Gamma'sDesign Patterns中有关Decorator模式的以下实现建议。



我根本看不到为什么需要抽象Decorator类?为什么所有装饰器都不能简单地直接实现/继承IComponent/Component?

最佳答案



Decorator模式中abstract类的目的是消除代码重复。 Decorator模式的关键是允许您包装具有新职责的现有Component。通过创建IS-A组件和HAS-A组件的新类来完成此包装:

public class Decorator implements Component {
    private Component component;

    public Decorator(Component component) { this.component = component; }
}

想象一下,您将再引入两个装饰器。您现在必须在两个新的装饰器中实现类似的代码。抽象装饰器可以帮助您完全解决此问题。通过将上述代码移至抽象类,您所有的具体装饰器都可以从其继承,而无需手动重新实现装饰器框架。

我知道上面的示例中的Decorator并没有太大作用;但是,请设想一种情况,您希望根据某些条件禁止进一步装饰。例如,如果成本超过15美元,则不允许在比萨饼上添加任何浇头。抽象装饰器可以通过在构造函数中的组件上调用getCost函数来解决此问题。这将导致对所有装饰器的所有getCost函数的调用,并为您带来最终费用。如果为getCost()>15,则应用程序可以通知用户费用不能超过15 $。这种代码重用是抽象装饰器类背后的真正动机。

09-30 15:49
查看更多