Interested Article - Заместитель (шаблон проектирования)

Заместитель ( англ. Proxy ) — структурный шаблон проектирования , предоставляющий объект , который контролирует доступ к другому объекту, перехватывая все вызовы (выполняет функцию контейнера ).

Цель

Проблема

Необходимо контролировать доступ к объекту, не изменяя при этом поведение клиента.

Необходимо иметь доступ к объекту так, чтобы не создавать реальные объекты непосредственно, а через другой объект, который может иметь дополнительную функциональность.

Решение

Создать суррогат реального объекта. «Заместитель» хранит ссылку, которая позволяет заместителю обратиться к реальному субъекту (объект класса «Заместитель» может обращаться к объекту класса «Субъект», если интерфейсы «Реального Субъекта» и «Субъекта» одинаковы). Поскольку интерфейс «Реального Субъекта» идентичен интерфейсу «Субъекта», так, что «Заместителя» можно подставить вместо «Реального Субъекта», контролирует доступ к «Реальному Субъекту», может отвечать за создание или удаление «Реального Субъекта». «Субъект» определяет общий для «Реального Субъекта» и «Заместителя» интерфейс так, что «Заместитель» может быть использован везде, где ожидается «Реальный Субъект». При необходимости запросы могут быть переадресованы «Заместителем» «Реальному Субъекту».

Виды

  • Протоколирующий прокси : сохраняет в лог все вызовы «Субъекта» с их параметрами.
  • Удалённый заместитель ( англ. remote proxies ): обеспечивает связь с «Субъектом», который находится в другом адресном пространстве или на удалённой машине. Также может отвечать за кодирование запроса и его аргументов и отправку закодированного запроса реальному «Субъекту»,
  • Виртуальный заместитель ( англ. virtual proxies ): обеспечивает создание реального «Субъекта» только тогда, когда он действительно понадобится. Также может кэшировать часть информации о реальном «Субъекте», чтобы отложить его создание,
  • Копировать-при-записи : обеспечивает копирование «субъекта» при выполнении клиентом определённых действий (частный случай «виртуального прокси»).
  • Защищающий заместитель ( англ. protection proxies ): может проверять, имеет ли вызывающий объект необходимые для выполнения запроса права.
  • Кэширующий прокси : обеспечивает временное хранение результатов расчёта до отдачи их множественным клиентам, которые могут разделить эти результаты.
  • Экранирующий прокси : защищает «Субъект» от опасных клиентов (или наоборот).
  • Синхронизирующий прокси : производит синхронизированный контроль доступа к «Субъекту» в асинхронной многопоточной среде.
  • «Умная» ссылка ( англ. smart reference proxy ): производит дополнительные действия, когда на «Субъект» создается ссылка, например, рассчитывает количество активных ссылок на «Субъект».

Преимущества и недостатки от применения

Преимущества

Недостатки

  • резкое увеличение времени отклика.

Сфера применения

Шаблон заместитель может применяться в случаях работы с сетевым соединением, с огромным объектом в памяти (или на диске) или с любым другим ресурсом, который сложно или тяжело копировать. Хорошо известный пример применения — объект, подсчитывающий число ссылок.

Прокси и близкие к нему шаблоны

  • Адаптер обеспечивает отличающийся интерфейс к объекту.
  • Прокси обеспечивает тот же самый интерфейс.
  • Декоратор обеспечивает расширенный интерфейс.

Примеры реализации

Java

Scala

C++

C#

JavaScript

Ruby

PHP5

ActionScript

Python

VB.NET

Swift

См. также

Примечания

  1. . Дата обращения: 26 мая 2010. Архивировано из 14 мая 2010 года.

Литература

  • от 14 мая 2010 на Wayback Machine
  • Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес . Приемы объектно-ориентированного проектирования. Паттерны проектирования.=Design Patterns.Elements of reusable object-oriented software. — СПб. : Питер, 2001. — 368 с. — ISBN 5-272-00355-1 .
  • Эрик Фримен, Элизабет Фримен, Кэтти Сьера, Берт Бейтс. Паттерны проектирования. — СПб. : Питер, 2012. — 656 с. — ISBN 978-5-459-00435-9 .

Ссылки

  • от 8 апреля 2012 на Wayback Machine — назначение, описание, особенности и реализация на C++.
Источник —

Same as Заместитель (шаблон проектирования)