Я заметил, что на всех примерах, иллюстрирующих шаблон декоратора, есть базовый класс/интерфейс, и есть класс декоратора, который наследует/реализует его, после чего все украшенные классы расширяют класс декоратора. Что-то по следующим направлениям:Неправильно ли использовать шаблон декоратора?
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 будет делать прямо в базовом классе. Я неправильно использую шаблон декоратора, если я использую его так? Я пропустил некоторые из его функций?
Что делать, если doOperation защищен? – Geo
Тогда это очень ясно. Пользователь базового класса ** не ** видит метод doOperation. Вы можете обратиться к шаблону проектирования шаблонов шаблонов для такого рода методов, чтобы этот метод был защищен и обеспечивал различную реализацию. –