Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Мотивация


 

 

/*

*/

#include "Geom.H"

class Event;

 

#ifdef Implementation

class Image {

public:

virtual void Draw(const Point&);

};

 

/*

*/

class Image;

extern Image* LoadAnImageFile(const char*);

// external function

/*

*/

class ImagePtr {

public:

ImagePtr(const char* imageFile);

virtual ~ImagePtr();

/*

*/

virtual Image* operator->();

virtual Image& operator*();

private:

Image* LoadImage();

private:

Image* _image;

const char* _imageFile;

};

/*

*/

ImagePtr::ImagePtr (const char* theImageFile) {

_imageFile = theImageFile;

_image = 0;

}

/*

*/

Image* ImagePtr::LoadImage () {

if (_image == 0) {

_image = LoadAnImageFile(_imageFile);

}

return _image;

}

/*

*/

Image* ImagePtr::operator-> () {

return LoadImage();

}

/*

*/

Image& ImagePtr::operator* () {

return *LoadImage();

}

/*

*/

void dummy () {

/*

*/

ImagePtr image = ImagePtr("anImageFileName");

image->Draw(Point(50, 100));

// (image.operator->())->Draw(Point(50, 100))

/*

*/

}

/*

*/

#endif

/*

*/

#ifdef SampleCode

#include "iostream.h"

#include "strings.h"

/*

*/

class Graphic {

public:

virtual ~Graphic();

/*

*/

virtual void Draw(const Point& at) = 0;

virtual void HandleMouse(Event& event) = 0;

/*

*/

virtual const Point& GetExtent() = 0;

/*

*/

virtual void Load(istream& from) = 0;

virtual void Save(ostream& to) = 0;

protected:

Graphic();

};

/*

*/

class Image: public Graphic {

public:

Image(const char* file); // loads image from a file

virtual ~Image();

/*

*/

virtual void Draw(const Point& at);

virtual void HandleMouse(Event& event);

/*

*/

virtual const Point& GetExtent();

/*

*/

virtual void Load(istream& from);

virtual void Save(ostream& to);

private:

//...

};

/*

*/

class ImageProxy: public Graphic {

public:

ImageProxy(const char* imageFile);

virtual ~ImageProxy();

/*

*/

virtual void Draw(const Point& at);

virtual void HandleMouse(Event& event);

/*

*/

virtual const Point& GetExtent();

/*

*/

virtual void Load(istream& from);

virtual void Save(ostream& to);

protected:

Image* GetImage();

private:

Image* _image;

Point _extent;

char* _fileName;

};

/*

*/

ImageProxy::ImageProxy (const char* fileName) {

_fileName = strdup(fileName);

_extent = Point::Zero; // don't know extent yet

_image = 0;

}

 

Image* ImageProxy::GetImage() {

if (_image == 0) {

_image = new Image(_fileName);

}

return _image;

}

/*

*/

const Point& ImageProxy::GetExtent () {

if (_extent == Point::Zero) {

_extent = GetImage()->GetExtent();

}

return _extent;

}

/*

*/

void ImageProxy::Draw (const Point& at) {

GetImage()->Draw(at);

}

/*

*/

void ImageProxy::HandleMouse (Event& event) {

GetImage()->HandleMouse(event);

}

/*

*/

void ImageProxy::Save (ostream& to) {

to << _extent << _fileName;

}

/*

*/

void ImageProxy::Load (istream& from) {

from >> _extent >> _fileName;

}

/*

*/

class TextDocument {

public:

TextDocument();

 

void Insert(Graphic*);

//...

};

/*

*/

void dummy () {

/*

*/

TextDocument* text = new TextDocument;

//...

text->Insert(new ImageProxy("anImageFileName"));

/*

*/

}

/*

*/

#endif

/*

*/

 

 

Лабораторная работа №7

Структурные паттерны

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


Содержание

1. Описание паттерна.. 3

1. Задание к лабораторной работе.. 8

2. Приложение №1. Базовые классы... 9

 

Описание паттерна

 

Паттерн Prox y

Название и классификация паттерна

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

Назначение

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

 

Мотивация

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

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

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

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

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

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

На следующей диаграмме классов этот пример показан более подробно.

 

Редактор документов получает доступ к встроенным изображениям только через интерфейс, определенный в абстрактном классе Graphic. ImageProxy – это класс для представления изображений, создаваемых по требованию. В ImageProxy хранится имя файла, играющее роль ссылки на изображение, которое находится на диске. Имя файла передается конструктору класса ImageProxy.

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

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




<== предыдущая лекция | следующая лекция ==>
Мотивация. Разумно управлять доступом к объекту, поскольку тогда можно отложить расходы на создание и инициализацию до момента | 

Дата добавления: 2015-10-19; просмотров: 368. Нарушение авторских прав; Мы поможем в написании вашей работы!




Практические расчеты на срез и смятие При изучении темы обратите внимание на основные расчетные предпосылки и условности расчета...


Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...


Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...


Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...

Расчет концентрации титрованных растворов с помощью поправочного коэффициента При выполнении серийных анализов ГОСТ или ведомственная инструкция обычно предусматривают применение раствора заданной концентрации или заданного титра...

Психолого-педагогическая характеристика студенческой группы   Характеристика группы составляется по 407 группе очного отделения зооинженерного факультета, бакалавриата по направлению «Биология» РГАУ-МСХА имени К...

Общая и профессиональная культура педагога: сущность, специфика, взаимосвязь Педагогическая культура- часть общечеловеческих культуры, в которой запечатлил духовные и материальные ценности образования и воспитания, осуществляя образовательно-воспитательный процесс...

ОЧАГОВЫЕ ТЕНИ В ЛЕГКОМ Очаговыми легочными инфильтратами проявляют себя различные по этиологии заболевания, в основе которых лежит бронхо-нодулярный процесс, который при рентгенологическом исследовании дает очагового характера тень, размерами не более 1 см в диаметре...

Примеры решения типовых задач. Пример 1.Степень диссоциации уксусной кислоты в 0,1 М растворе равна 1,32∙10-2   Пример 1.Степень диссоциации уксусной кислоты в 0,1 М растворе равна 1,32∙10-2. Найдите константу диссоциации кислоты и значение рК. Решение. Подставим данные задачи в уравнение закона разбавления К = a2См/(1 –a) =...

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

Studopedia.info - Студопедия - 2014-2025 год . (0.014 сек.) русская версия | украинская версия