Обзор темы [Шаблоны проектирования]

Затем: МотивацияНазначение

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

Затем: СтруктураМотивация

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

Такие ограничения ведут к созданию каждого дорогой объекта по требованию, которое в нашем случае происходит, когда изображение становится видимым. Но что мы помещаем в документ вместо изображения? И как мы можем скрывать тот факт, что изображение создано по требованию так, чтобы мы не усложнили реализацию редактора? Кроме того, эта оптимизация не должна воздействовать на исполнение и код форматирования.

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

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

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

Следующая диаграмма класса иллюстрирует этот пример более подробно.

Редактор документа внедрил изображения через интерфейс, определенный абстрактным классом Graphic. ImageProxy - класс для изображений, которые созданы по требованию. ImageProxy поддерживает имя файла как ссылку на изображение на диске. Имя файла передано как параметр к ImageProxy конструктору.

ImageProxy также сохраняет поля ограничения изображения и ссылки к реальному экземпляру Image. Эта ссылка не будет допустима до инстанцирования реального изображения. Операция Draw удостоверится, что изображение инстанцировано до пересылки запроса. GetExtent передает запрос к изображению только, если оно уже есть; иначе ImageProxy возвращает рамер который он хранит.

Затем: Составные частиСтруктура

Объектная диаграмма во времени выполнения:

Составные части