Заместитель
Proxy
Тип структурный
Назначение Предоставляет суррогатный объект, управляющий доступом к другому объекту.
Плюсы
  •  удалённый заместитель;
  •  виртуальный заместитель может выполнять оптимизацию;
  •  защищающий заместитель;
  • «умная» ссылка;
Минусы
  • резкое увеличение времени отклика.
Описан в Design Patterns Да

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

Цель

править

Проблема

править

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

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

Решение

править

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

Виды

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

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

править

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

править
  • удалённый заместитель;
  • виртуальный заместитель может выполнять оптимизацию;
  • защищающий заместитель;
  • «умная» ссылка(указатель);

Недостатки

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

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

править

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

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

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

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

править

Java

править

Scala

править

C++

править

C#

править

JavaScript

править

Ruby

править

PHP5

править

ActionScript

править

Python

править

VB.NET

править

Swift

править

См. также

править

Примечания

править
  1. Дневники разработчика // Заместитель (Proxy). Дата обращения: 26 мая 2010. Архивировано из оригинала 14 мая 2010 года.

Литература

править
  • CodeLIB.YOURS // Заместитель (Proxy) Архивная копия от 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.

Ссылки

править

📚 Artikel Terkait di Wikipedia

Шаблон проектирования

Шаблон проектирования (паттерн, от англ. design pattern) — повторяемая архитектурная конструкция в сфере проектирования программного обеспечения, предлагающая

Принцип единственной ответственности

Разработка через тестирование Шаблон «Выделение класса» Шаблон «Фасад» Шаблон «Proxy» DAO Классическим примером нарушения SRP может служить ситуация, когда системе

Массовое пермское вымирание

R. (Октябрь 2015). Global warming and the end-Permian extinction event: Proxy and modeling perspectives. Earth-Science Reviews. 149: 5—22. Bibcode:2015ESRv

Блокировка с двойной проверкой

getattr(self(), name) def lazy(proxy_cls=SimpleLazyProxy): '''декоратор, превращающий класс в класс с ленивой инициализацией средствами Proxy-класса''' class ClassDecorator:

Посредник (шаблон проектирования)

текст на Python from abc import ABCMeta, abstractmethod from weakref import proxy import inspect class Mediator(metaclass=ABCMeta): """ Абстрактный канал

Model-View-ViewModel

JET Ext JS SwiftUI Jetpack Compose Introduction to Model/View/ViewModel pattern for building WPF apps . Дата обращения: 13 ноября 2010. Архивировано 12

Компоновщик (шаблон проектирования)

Компоновщик (англ. Composite pattern) — структурный шаблон проектирования, объединяющий объекты в древовидную структуру для представления иерархии от

Null object (шаблон проектирования)

поведение (или отсутствие такового). Впервые опубликован в серии книг Pattern Languages of Program Design. В таких объектно-ориентированных языках как