Это неправильно использовать шаблон декоратора, как это? - PullRequest
2 голосов
/ 11 июня 2009

Я заметил, что во всех примерах, иллюстрирующих шаблон декоратора, существует базовый класс / интерфейс и класс декоратора, который наследует / реализует его, после чего все декорированные классы расширяют класс декоратора. Что-то вроде следующего:

Interface Window > WindowDecorator > WindowDecorator > VerticalScrollBarDecorator

вышеприведенная иерархия взята из страницы шаблона проектирования Википедии .

Дело в том, что я хочу украсить некоторые классы "Операция" и иметь что-то в следующей иерархии:

  • корневой класс Операция

  • оформленными классами могут быть 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 ]

2 голосов
/ 11 июня 2009

Шаблон декоратора используется для предоставления специальных функций объектам во время выполнения. (Предполагая, что Объекты уже существуют, и в некоторых случаях необходимо добавлять новые функции).

Следовательно, класс Decorator реализует и объединяет существующий базовый класс, чтобы операции могли быть расширены. Базовый класс будет оставлен без изменений, а DecoratorClass используется, когда требуется специальное поведение, предоставляя экземпляр BaseClass.

В вашем случае имена методов разные. Пользователь базового класса (который не знает класса Decorated) может запутаться, использовать ли doOperation или executeOperation.

1 голос
/ 11 июня 2009

Ну, во-первых, вы не ничего не используете , вы пишете код. Не поддавайтесь искушению дать ему имя и искусственно сделать его шаблоном это не так.

Во-вторых, если единственное, что вы делаете, это создаете новый объект, просто чтобы вы могли вызывать ваш doOperation() с некоторыми аргументами, то это можно считать странным замыслом.

Нет необходимости создавать абстракцию только для передачи параметров.

В этом случае, если вы настаиваете на сравнении с шаблоном Decorator: да, это неправильное использование.

...