Добавление функции в шаблон декоратора интерфейса

#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. Спасибо, это то, чему меня учили в прошлом году, и это почему-то всегда казалось странным (мне все равно потребовался год, чтобы проверить онлайн, но, по крайней мере, я это сделал ! 🙂 ). Спасибо за отличное разъяснение.