Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

Подменяет другой объект для контроля доступа к нему.

 

Назначение

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

Применимость

Паттерн Заместитель применим во всех случаях, когда возникает необходимость сослаться на объект более изощренно, чем это возможно, если использовать простой указатель. Вот несколько типичных ситуаций, где заместитель оказывается полезным:

  • удаленный заместитель предоставляет локального представителя вместо объекта, находящегося в другом адресном пространстве;
  • виртуальный заместитель создает "тяжелые" объекты по требованию;
  • защищающий заместитель. контролирует доступ к исходному объекту. Такие заместители полезны, когда для разных объектов определены различные права доступа;

Результаты

С помощью паттерна заместитель при доступе к объекту вводится дополнительный уровень косвенности. У это подхода есть много вариантов в зависимости от вида заместителя:

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

Структура

Участники

Proxy - заместитель:

  • хранит ссылку, которая позволяет заместителю обратиться к реальному субъекту. Объект класса Proxy может обращаться к субъекту класса Subject, если интерфейсы классов RealSubject и Subject одинаковы;
  • предоставляет интерфейс идентичный интерфейсу Subject, так что заместитель всегда может быть представлен в виде реального субъекта;
  • контролирует доступ к реальному субъекту и может отвечать за его создание и удаление;
  • прочие обязанности зависят от вида заместителя:
    • удаленный заместитель отвечает за кодирование запроса и его аргументов и отправление реальному субъекту в другом адресном пространстве;
    • виртуальный заместитель может кэшировать дополнительную информацию о реальном субъекте, чтобы отложить его создание;
    • защищающий заместитель проверяет, имеет ли вызывающий объект необходимые для выполнения запроса права;

Subject - субъект: определяет общий для RealSubject и Proxy интерфейс, так что класс Proxy можно использовать везде, где ожидается RealSubject;

RealSubject - реальный субъект: определяет реальный объект, представленный заместителем.