Различия между шаблоном 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 статья цитирует сходства и различия в превосходном виде.
Связанные вопросы/ссылки:
Когда использовать шаблон декоратора?
Какая разница между шаблонами адаптера и прокси?