Разница между рисунком декоратора и шаблоном делегирования - программирование
Подтвердить что ты не робот

Разница между рисунком декоратора и шаблоном делегирования

В чем разница между шаблоном Decorator и шаблоном делегирования (если таковой имеется)? Я не хочу знать о деталях реализации, а также о различиях в использовании и субъективной точке зрения, как их использовать.

РЕДАКТИРОВАТЬ:. Вы можете указать исходный код (в проекте ОС), где используется этот шаблон (особенно делегирование, поскольку декорация используется в Java IO-классах). Я ищу какое-то реальное использование, а не просто фиктивный пример. Возможно, эти шаблоны одинаковы и отличаются только заголовком. Вы можете написать это мнение.

4b9b3361

Ответ 1

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

Делегирование (или состав) - это не столько шаблон, сколько общий способ построения сложного поведения, координируя использование нескольких других объектов. Он часто используется в статическом или статичном виде. Под "set or static" я имею в виду что-то вроде этого:

class Delegator {
  private final ClassA a = new ClassA();
  private final ClassB b = new ClassB();

  public void doWork() {
     a.setup();
     final ResFromA resa = a.getRes();
     b.setup();
     b.consume(resa);
  }

}

Обратите внимание, что Делегатор не использует ни один тип или интерфейс с ClassA или ClassB и знает точный тип a и b.

Decorator - это динамический способ использования делегирования для добавления поведения в логический объект во время выполнения. В Decorator все объекты имеют общий интерфейс и используют делегирование для объединения своей работы.

public interface Item {
  public void drawAt(final int x, final int y);
}

public class CircleAround implements Item {
  private final Item wrapped;
  private final int radius;

  public CircleAround(public final Item wrapped, public final int radius) {
    this.wrapped = wrapped;
    this.radius = radius;
  }

  public void drawAt(final int x, final int y) {
    // First handle whatever we are wrapping
    wrapped.drawAt(x,y);
    // Then add our circle
    Graphics.drawCircle(x, y, radius);
  }

}

Обратите внимание, что в отличие от первого примера, CircleAround не знает точного типа элемента, который он обертывает, и совместно использует общий интерфейс с ним.

Ответ 2

Я думаю, что "шаблон делегирования" провалил бы лакмусовый тест того, что является или не является образцом довольно четко. Например, люди все еще говорят "Я знаю шаблон Factory" все время. Нет шаблона Factory. Это идиома (см. Advanced С++ by James Coplien). Эта страница тоже очень слаба; Я не вижу простого делегирования в качестве инверсии ответственности.

Декоратор используется, когда украшаемый код должен быть дополнен. Декоратор обертывается вокруг декоратора и по-прежнему вызывает его методы, он просто делает вещи до или после. Это одна из причин, по которой люди часто говорят об Decorator, когда возникают аспекты: это шаблон, который опирается на посредничество, а не на сотрудничество, с его группой. (Вот почему во многих случаях, например, когда у вас нет источника, вы должны использовать Decorator.)

Decorator работает лучше всего, когда вы хотите взять что-то, что работает, и заставить его сделать что-то еще, но не изменить интерфейс вообще. Представьте, что у вас есть класс репозитория, который выдает интерфейс, в котором есть методы CRUD. Теперь вы хотите добавить кеширование. Вы можете сделать CachedRepository, который украсит репозиторий и прочитает его, он будет выглядеть в кеше, если он там не будет, тогда он будет вызывать обычный метод репозитория, иначе он может просто вернуть кешированную копию. В классе репозитория код не был изменен, и пользователи этого класса ничего не знают о кешировании.