Подменяет другой объект для контроля доступа к нему.
Назначение
Является суррогатом другого объекта и контролирует доступ к нему.
Применимость
Паттерн Заместитель применим во всех случаях, когда возникает необходимость сослаться на объект более изощренно, чем это возможно, если использовать простой указатель. Вот несколько типичных ситуаций, где заместитель оказывается полезным:
- удаленный заместитель предоставляет локального представителя вместо объекта, находящегося в другом адресном пространстве;
- виртуальный заместитель создает "тяжелые" объекты по требованию;
- защищающий заместитель. контролирует доступ к исходному объекту. Такие заместители полезны, когда для разных объектов определены различные права доступа;
Результаты
С помощью паттерна заместитель при доступе к объекту вводится дополнительный уровень косвенности. У это подхода есть много вариантов в зависимости от вида заместителя:
- удаленный заместитель может скрыть тот факт, что объект находится в другом адресном пространстве;
- виртуальный заместитель может выполнять оптимизацию, например создание объекта по требованию;
- защищающий заместитель позволяет решать дополнительные задачи при доступе к объекту;
Структура
Участники
Proxy - заместитель:
- хранит ссылку, которая позволяет заместителю обратиться к реальному субъекту. Объект класса Proxy может обращаться к субъекту класса Subject, если интерфейсы классов RealSubject и Subject одинаковы;
- предоставляет интерфейс идентичный интерфейсу Subject, так что заместитель всегда может быть представлен в виде реального субъекта;
- контролирует доступ к реальному субъекту и может отвечать за его создание и удаление;
- прочие обязанности зависят от вида заместителя:
- удаленный заместитель отвечает за кодирование запроса и его аргументов и отправление реальному субъекту в другом адресном пространстве;
- виртуальный заместитель может кэшировать дополнительную информацию о реальном субъекте, чтобы отложить его создание;
- защищающий заместитель проверяет, имеет ли вызывающий объект необходимые для выполнения запроса права;
Subject - субъект: определяет общий для RealSubject и Proxy интерфейс, так что класс Proxy можно использовать везде, где ожидается RealSubject;
RealSubject - реальный субъект: определяет реальный объект, представленный заместителем.