使用像这样的装饰器模式是错误的吗?

时间:2009-06-11 08:26:47

标签: java design-patterns decorator

我注意到在所有说明装饰器模式的例子中,有一个基类/接口,并且有一个继承/实现它的装饰器类,之后,所有装饰的类都扩展了装饰器类。以下内容:

Interface Window > WindowDecorator > WindowDecorator > VerticalScrollBarDecorator

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

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

  • 根类是操作

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

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


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

一个抽象方法(让我们称之为 doOperation )执行操作(以及每个子类重写)和另一个调用“存储”对象的 doOperation 的方法,如这(位于基类):


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

问题是,当我可以完成OperationDecorator类在基类中所做的一切时,我真的不需要在这里使用OperationDecorator类。如果我像这样使用它,我会误用装饰器模式吗?我错过了它的一些功能吗?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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

不需要仅仅为了传递参数而创建抽象。

在这种情况下,如果你坚持要与Decorator模式进行比较:是的,这是误用。