#java #design-patterns #decorator #decorator-pattern
Вопрос:
Привет,
Я пытаюсь разобраться в шаблоне декоратора, и я в чем-то не уверен :
Считается ли плохой практикой или неправильным использованием шаблона добавление функции в интерфейс, когда я хочу добавить новую функциональность ?
Например, если у меня есть интерфейс автомобиля, и я хочу сделать его амфибией с украшением, разрешено ли добавлять getAquaticSpeed()
функцию в интерфейс только с целью добавления этой функции ?
Заранее спасибо!
Пример кода :
interface Car{
public float getSpeed();
}
public class CarFrame implements Car{
public float getSpeed(){return 0;}
}
public abstract CarDecorator implements Car{
private Car delegate;
public CarDecorator(Car delegate){
this.delegate = delegate
}
public float getSpeed(){return delegate.getSpeed();}
}
Если я хочу добавить водную скорость, цвета и т.д. В свой автомобиль, можно ли добавить новую функцию в мой основной интерфейс ?
Вот так :
interface Car{
public float getSpeed();
public float getAquaticSpeed();
public String getColor();
}
Комментарии:
1. Возможно, я сегодня немного ленив, но если бы вы добавили несколько строк кода, я бы вам помог
2. Это буквально теоретический вопрос. Я все равно отредактирую свой вопрос, если он соответствует вашим потребностям, но показывать будет нечего, так как он не основан на реальном проекте. @Renato
3. Вы, конечно, можете расширить интерфейс автомобиля и добавить к нему дополнительные методы.
Ответ №1:
Вы, конечно, можете добавить в API декоратора, сделав его надмножеством интерфейса в объекте, который он обертывает. Первое предложение в главе «Декоратор» книги GoF — это,
Намерение
Динамически возлагает дополнительные обязанности на объект.
Структура UML на странице 177 книги показывает конкретных декораторов, addedState
а также AddedBehavior()
то, что возложение ответственности за добавление функции вполне приемлемо.
Что касается редактирования, нет, вы не можете изменить предыдущий интерфейс. Это нарушило бы Принцип Единой ответственности, Принцип Открытости/Закрытости, и, кроме того, это не имело бы никакого отношения к Шаблону Декоратора. Если вы редактируете исходный интерфейс, декоратор бесполезен.
Комментарии:
1. Я только что отредактировал свой вопрос, если вы хотите взглянуть. Я посмотрю книгу ГоФ, спасибо !
2. Спасибо, это то, чему меня учили в прошлом году, и это почему-то всегда казалось странным (мне все равно потребовался год, чтобы проверить онлайн, но, по крайней мере, я это сделал ! 🙂 ). Спасибо за отличное разъяснение.