【问题标题】:Is it wrong to use the decorator pattern like this?像这样使用装饰器模式有错吗?
【发布时间】:2009-06-11 08:26:46
【问题描述】:

我注意到,在所有说明装饰器模式的示例中,都有一个基类/接口和一个继承/实现它的装饰器类,之后,所有装饰类都扩展了装饰器类。大致如下:

界面窗口 > WindowDecorator > WindowDecorator > VerticalScrollBarDecorator

以上层次结构取自Wikipedia's Design Pattern Page

问题是,我想装饰一些“操作”类,并具有以下层次结构:

  • 根类是操作

  • 装饰类可以是 Operation1、Operation2 等。

我会有一个构造函数在我的 Operation 类中使用一个 Operation 对象,如下所示:


public Operation(Operation op)
{
  this.op = op;
}

一个执行操作的抽象方法(我们称之为 doOperation)和另一个调用“存储”对象的 doOperation 的方法,例如this(位于基类中):


public void executeOperation(some_args_here)
{
  if(op != null)
    op.doOperation(); // call stored object's doOperation first
  doOperation(); //execute this operation
}

问题是,当我可以做 OperationDecorator 类在基类中可以做的所有事情时,我真的不认为需要 OperationDecorator 类。如果我这样使用装饰器模式,我是否滥用了它?我错过了它的一些功能吗?

【问题讨论】:

    标签: java design-patterns decorator


    【解决方案1】:

    装饰器模式用于在运行时为对象提供特殊功能。 (假设对象已经存在,并且在某些情况下需要添加新功能)。

    因此,Decorator 类实现并聚合现有的 Base 类,以便可以扩展操作。 Base 类将保持不变,当需要特殊行为时,通过提供 BaseClass 的实例使用 DecoratorClass。

    在您的情况下,方法名称不同。 Base 类的用户(不知道 Decorated 类)可能会混淆是使用doOperation 还是executeOperation

    【讨论】:

    • 如果doOperation受到保护怎么办?
    • 那么就很清楚了吧。基类的用户没有看到 doOperation 方法。您可以参考模板方法设计模式,将方法设为受保护并提供不同的实现。
    【解决方案2】:

    嗯,首先,你没有滥用任何东西,你正在编写代码。不要试图给它起名字,并人为地将它变成一个模式它不是。

    其次,如果您要做的唯一事情是创建一个新对象,以便您可以使用一些参数调用您的doOperation(),那么它可以被认为是一个奇怪的设计。

    没有必要仅仅为了传递参数而创建抽象。

    在这种情况下,如果您坚持与装饰器模式进行比较:是的,这是误用。

    【讨论】:

      猜你喜欢
      • 2016-09-04
      • 2019-02-23
      • 1970-01-01
      • 2013-05-07
      • 2014-07-07
      • 2011-09-08
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多