我注意到在所有说明装饰器模式的例子中,有一个基类/接口,并且有一个继承/实现它的装饰器类,之后,所有装饰的类都扩展了装饰器类。以下内容:
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类。如果我像这样使用它,我会误用装饰器模式吗?我错过了它的一些功能吗?
答案 0 :(得分:2)
装饰器模式用于在运行时为对象提供特殊功能。 (假设对象已经存在,并且在某些情况下需要添加新功能)。
因此,Decorator类实现并聚合现有的Base类,以便可以扩展操作。 Base类将保持不变,并且在通过给出BaseClass实例需要特殊行为时使用DecoratorClass。
在您的情况下,方法名称是不同的。 Base类的用户(不知道装饰类)可能会混淆是使用doOperation
还是executeOperation
。
答案 1 :(得分:1)
嗯,首先,你没有滥用任何东西,你正在编写代码。不要试图给它起名字,并且人为地使它成为模式它不是。
其次,如果您正在做的唯一事情就是创建一个新对象,以便您可以使用某些参数调用doOperation()
,那么它可以被认为是一种奇怪的设计。
不需要仅仅为了传递参数而创建抽象。
在这种情况下,如果你坚持要与Decorator模式进行比较:是的,这是误用。