Название и классификация образца
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Заместитель – паттерн, структурирующий объекты

Назначение

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

Известен также под именем

Surrogate (суррогат)

Proxy: мотивация

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

В связи с такими ограничениями кажется разумным создавать «тяжелые» объекты по требованию. Это означает «когда изображение становится видимым». Но что поместить в документ вместо изображения? И как, не усложняя реализции редактора, скрыть то, что изображение создается по требованию? Например, оптимизация не должна отражаться на коде, отвечающем за рисование и форматирование.

Решение состоит в том, чтобы использовать другой объект – заместитель изображения, который временно подставляется вместо реального изображения. Заместитель ведет себя точно так же, как само изображение, и выполняет при необходимости его инстанцирование.

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

Предположим, что изображения хранятся в отдельных файлах. В таком случае мы можем использовать имя файла как ссылку на реальный объект. Заместитель хранит также размер изображения, то есть длину и ширину. «Зная» ее, заместитель может отвечать на запросы форматера о своем размере, не инстанцируя изображение.

Рисунок 23

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

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

• Удаленный заместитель предоставляет локального представителя вместо объекта, находящегося в другом адресном пространстве (на другом компьютере). Такой заместитель используют RMI (удаленный вызов метода), CORBA (технология построения распределенных приложений).

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

• Защищающий заместитель контролирует доступ к исходному объекту.

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

• подсчет числа ссылок на реальный объект

• загрузку объекта в память при первом обращении к нему

• проверку и установку блокировки на реальный объект при обращении к нему, чтобы никакой другой объект не смог в это время изменить его

Proxy: структура

Рисунок 24

Диаграмма объектов

Рисунок 25

Участники

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

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

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







Отношения

Proxy при необходимости переадресует запросы объекту RealSubject. Детали зависят от вида заместителя.

Дата: 2019-02-25, просмотров: 219.