Различия между прокси-сервером и шаблоном декоратора
можете ли вы дать какое-либо хорошее объяснение, в чем разница между Прокси и оформителя?
главное отличие я вижу в том, что когда мы предполагаем, что Прокси использует состав и оформителя использует агрегация тогда, кажется, ясно, что с помощью нескольких (один или несколько) декораторы вы можете изменить/ добавить функциональные возможности в уже существующий экземпляр (украсить), в то время как Прокси имеет собственный внутренний экземпляр проксируемого класса и делегирует ему некоторые дополнительные функции (поведение прокси).
вопрос -Прокси создан с агрегацией по-прежнему Прокси или А оформителя? Разрешено ли (по определению в шаблонах GoF) создавать Прокси с агрегацией?
5 ответов:
оформителя шаблон фокусируется на динамическом добавлении функций к объекту, в то время как Прокси шаблон фокусируется на управлении доступом к объекту.
EDIT: -
отношения между Прокси и реальная тема обычно устанавливается во время компиляции, Прокси создает его каким-то образом, в то время как оформителя назначается субъекту во время выполнения, зная только интерфейс субъекта.
принятый ответ не совсем корректен. Реальная разница заключается не в собственности (состав против агрегации), а скорее в типе информации.
A оформителя и всегда прошел delegatee. А Проксиможет создать его сам, или он может его вводят.
но a Проксивсегда знает (более) конкретный тип делегата. Другими словами, Прокси и его делегат будет иметь тот же базовый тип, но Прокси указывает на производный тип. А оформителя указывает на свой собственный базовый тип. Таким образом, разница заключается во времени компиляции информации о типе делегата.
в динамическом языке, если делегат вводится и имеет тот же интерфейс, то нет никакой разницы.
ответ на ваш вопрос - "Да".
оформителя получить ссылку на украшенный объект (обычно через конструктор) в то время как Прокси ответственность, чтобы сделать это сам.
Прокси может вообще не создавать экземпляр объекта обертывания (например, это делает ORMs, чтобы предотвратить ненужный доступ к БД, если поля объекта / геттеры не используются) в то время как оформителя всегда держите ссылку на фактический завернутый экземпляр.
Прокси как правило, используются рамки, чтобы добавить безопасности или кэширование / lazing и построенный фреймворком (а не самим обычным разработчиком).
оформителя обычно используется для добавления нового поведения к старым или устаревшим классам самим разработчиком на основе интерфейса, а не фактического класса (поэтому он работает на широком диапазоне экземпляров интерфейса,Прокси вокруг конкретного класса).
основные отличия:
- Прокси обеспечивает тот же интерфейс. оформителя обеспечивает улучшенный интерфейс.
- оформителя и Прокси имеют разные цели, но схожие структуры. Оба описывают, как обеспечить уровень косвенности к другому объекту, и реализации сохраняют ссылку на объект, к которому они направляют запросы.
- оформителя можно рассматривать как вырожденный композит только с одним компонентом. Однако, декоратор добавляет дополнительные обязанности - он не предназначен для агрегирования объекта.
- оформителя поддерживает рекурсивные состав
- The оформителя класс объявляет a состав отношение к интерфейсу LCD (самый низкий знаменатель класса), и эти данные член инициализируется в конструкторе.
- использовать Прокси для ленивой инициализации, повышения производительности путем кэширования объекта и управление доступом к клиенту / абоненту
Sourcemaking статья цитирует сходства и различия в отличный способ.
связанные с SE вопросы / ссылки:
прокси и декоратор отличаются по назначению и где они сосредоточены на внутренней реализации. Прокси-сервер предназначен для использования удаленного, кросс-процесса или кросс-сетевого объекта, как если бы это был локальный объект. Декоратор предназначен для добавления нового поведения в исходный интерфейс.
хотя оба паттерна схожи по структуре, основная сложность прокси заключается в обеспечении правильной связи с исходным объектом. Декоратор, с другой стороны, фокусируется на реализации добавленного поведение.
Comments