2009-06-11 2 views
2

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

Interface Window > WindowDecorator > WindowDecorator > VerticalScrollBarDecorator

выше иерархия была взята из Wikipedia's Design Pattern Page.

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

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

  • оформленные классы могут быть Operation1, работы2 , и так далее.

Я бы конструктор, принимающий объект управления в моем классе операции, как это:


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 будет делать прямо в базовом классе. Я неправильно использую шаблон декоратора, если я использую его так? Я пропустил некоторые из его функций?

ответ

1

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

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

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

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

2

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

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

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

+0

Что делать, если doOperation защищен? – Geo

+0

Тогда это очень ясно. Пользователь базового класса ** не ** видит метод doOperation. Вы можете обратиться к шаблону проектирования шаблонов шаблонов для такого рода методов, чтобы этот метод был защищен и обеспечивал различную реализацию. –