Заместитель (Proxy)

Метафора

 

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

 

Назначение

 

Является суррогатом другого объекта и контролирует доступ к нему. Решает проблему контроля доступа к объекту, не изменяя при этом клиента.

Паттерн заместитель очень сильно напоминает другой шаблон с похожим назначением – «декоратор». Однако у них разные цели, заместитель в отличие от декоратора не должен изменять результаты операции реального объекта. Кроме того, заместитель определяет статическую связь заместителя и объекта, когда как декоратор определяет это динамически.

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

 

Диаграмма

 

Заместитель

Заместитель

 

Пример

 

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