Различия между шаблоном Proxy и Decorator

Можете ли вы дать какое-либо хорошее объяснение, в чем разница между Proxy и Decorator?

Основное различие, которое я вижу, состоит в том, что, когда мы предполагаем, что Proxy использует состав, а Decorator использует агрегацию, тогда кажется очевидным, что, используя несколько (один или несколько) Decorators, вы можете изменять/добавлять функциональные возможности в ранее существовавший экземпляр (украшать), тогда как прокси имеет собственный внутренний экземпляр прокси-класса и делегирует ему дополнительные функции (поведение прокси).

Вопрос: Создает ли прокси-сервер с агрегацией все-таки прокси или, скорее, Decorator? Разрешено ли (по определению в шаблонах GoF) создание прокси с агрегацией?

Ответ 1

Декоратор Шаблон фокусируется на динамическом добавлении функций объекту, а Прокси. Шаблон фокусируется на управлении доступом к объекту.

EDIT: -

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

Ответ 2

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

A Decorator всегда передается делегату. A Прокси может создать его самостоятельно, или он может его ввести.

Но Прокси всегда знает (более) определенный тип делегата. Другими словами, Прокси и его делегат будут иметь одинаковый базовый тип, но Прокси указывает на некоторый производный тип. Декоратор указывает на собственный базовый тип. Таким образом, разница заключается в информации времени компиляции о типе делегата.

В динамическом языке, если делегат вводится и имеет один и тот же интерфейс, тогда нет разницы.

Ответ на ваш вопрос: "Да".

Ответ 3

Decorator получить ссылку для декорированного объекта (обычно через конструктор), в то время как Прокси отвечает за это сам.

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

Прокси, обычно используемый фреймворками для добавления безопасности или кэширования/отладки и построенных каркасом (не самим разработчиком).

Decorator обычно используется для добавления нового поведения к старым или устаревшим классам самим разработчиком на основе интерфейса, а не фактического класса (поэтому он работает с широким спектром интерфейсных экземпляров, Proxy > находится вокруг конкретного класса).

Ответ 4

Основные отличия:

  • Прокси предоставляет один и тот же интерфейс. Декоратор предоставляет улучшенный интерфейс.
  • Декоратор и Прокси имеют разные цели, но аналогичные структуры. Оба описывают, как обеспечить уровень косвенности другому объекту, а реализации содержат ссылку на объект, к которому они направляют запросы.
  • Decorator можно рассматривать как вырожденный композит с одним компонентом. Тем не менее, Decorator добавляет дополнительные обязанности - он не предназначен для агрегации объектов.
  • Декоратор поддерживает рекурсивную композицию
  • Класс Decorator объявляет отношение композиции к интерфейсу LCD (Lowest Class Denominator), и этот элемент данных инициализируется в его конструкторе.
  • Используйте Прокси для ленивой инициализации, повышения производительности путем кэширования объекта и контроля доступа к клиенту/вызывающему абоненту

Sourcemaking статья цитирует сходства и различия в превосходном виде.

Связанные вопросы/ссылки:

Когда использовать шаблон декоратора?

Какая разница между шаблонами адаптера и прокси?