Студопедия
Главная страница | Контакты | Случайная страница

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

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

Читайте также:
  1. Введение в паттерны проектирования
  2. Введение в паттерны проектирования
  3. Введение в паттерны проектирования
  4. Введение в паттерны проектирования
  5. Введение в паттерны проектирования
  6. Введение в паттерны проектирования
  7. Гдд Паттерны поведения
  8. Глава 1. Введение в паттерны проектирования
  9. ГЛАВА 2. ИНФОРМАЦИОННО-СТРУКТУРНЫЕ ОСНОВЫ КРИМИНАЛИСТИЧЕСКОГО ИЗУЧЕНИЯ ПРЕСТУПНОЙ ДЕЯТЕЛЬНОСТИ И ЕЕ РАССЛЕДОВАНИЯ
  10. Глава 3. Порождающие паттерны

 

class XWindowImp: public Windowlmp { public:

XWindowImp();

virtual void DeviceRect(Coord, Coord, Coord, Coord); // прочие операции открытого интерфейса... private:

// переменные, описывающие специфичное для X Window состояние,

// в том числе:

Display* _dpy;

Drawable _winid; // идентификатор окна

GC _gc; // графический контекст окна

Для Presentation Manager (РМ) мы определяем класс PMWindowImp:

class PMWindowImp: public Windowlmp { public:

PMWindowImp ();

virtual void DeviceRect(Coord, Coord, Coord, Coord);

// прочие операции открытого интерфейса... private:

// переменные, описывающие специфичное для РМ Window состояние, // в том числе: HPS_hps;

Эти подклассы реализуют операции Windowlmp в терминах примитивов оконной системы. Например, DeviceRect для X Window реализуется так:

void XWindowImp::DeviceRect (

Coord xO, Coord yO, Coord xl, Coord yl

int x = round(min(xO, xl)); int у = rpund(min(yO, yl)); int w = round(abs(xO - xl)}; int h = round(abs(yO - yl)); XDrawRectangle(_dpy, _winid, _gc, x, y, w, h);

А для РМ - так:

void PMWindowImp::DeviceRect (

Coord xO, Coord yO, Coord xl, Coord yl

Coord left = min(xO, xl); Coord right = max(xO, xl); Coord bottom = min(yO, yl); Coord top = max(yO, yl);

PPOINTL point[4];


Паттерн Bridge

point [0].x = left; point [0].у = top;

point[1].x = right; point[1].у = top;

point[2].x = right; point[2].у = bottom;

point[3].x = left; point[3].у = bottom;

if (

(GpiBeginPath(_hps, 1L) == false) I I

(GpiSetCurrentPosition(_hps, &point[3]) == false) II (GpiPolyLine(_hps, 4L, point) == GPI_ERROR) II (GpiEndPath(_hps) == false)

) {

// сообщить об ошибке

} else {

GpiStrokePath(_hps, 1L, OL); I I

Как окно получает экземпляр нужного подкласса Windowlmp? В данном приме­ре мы предположим, что за это отвечает класс Window. Его операция GetWindowImp получает подходящий экземпляр от абстрактной фабрики (см. описание паттерна абстрактная фабрика), которая инкапсулирует все зависимости от оконной сис­темы.

Windowlmp* Window:: GetWindowImp () { if (_imp == 0) {

imp = WindowSystemFactory:: Instance () ->MakeWindowImp();

}

return _imp;

WindowSystemFactory:: Instance () возвращает абстрактную фабрику, ко­торая изготавливает все системно-зависимые объекты. Для простоты мы сделали эту фабрику одиночкой и позволили классу Window обращаться к ней напрямую.

Известные применения

Пример класса Window позаимствован из ЕТ++ [WGM88]. В ЕТ++ класс Windowlmp называется WindowPort и имеет такие подклассы, как XWindowPort и SunWindowPort. Объект Window создает соответствующего себе реализатора Implementor, запрашивая его у абстрактной фабрики, которая называется WindowSystem. Эта фабрика предоставляет интерфейс для создания платфор-менно-зависимых объектов: шрифтов, курсоров, растровых изображений и т.д.

Дизайн классов Window/WindowPort в ЕТ++ обобщает паттерн мост в том отношении, что WindowPort сохраняет также обратную ссылку на Window. Класс-реализатор WindowPort использует эту ссылку для извещения Window о собы­тиях, специфичных для WindowPort: поступлений событий ввода, изменениях размера окна и т.д.

В работах Джеймса Коплиена [Сор92] и Бьерна Страуструпа [Str91] упоми­наются классы описателей и приводятся некоторые примеры. Основной акцент


>ЛЦ Структурные паттерны

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

В библиотеке libg++ [Lea88] определены классы, которые реализуют универ­сальные структуры данных: Set (множество), LinkedSet (множество как связан­ный список), HashSet (множество какхэш-та блица), LihkedList (связанный спи­сок) и HashTable (хэш-таблица). Set - это абстрактный класс, определяющий абстракцию множества, a LinkedList и HashTable - конкретные реализации связанного списка и хэш-таблицы. LinkedSet и HashSet - реализаторы абстрак­ции Set, перекидывающие мост между Set и LinkedList и HashTable соот­ветственно. Перед вами пример вырожденного моста, поскольку абстрактного класса Implement or здесь нет.

В библиотеке NeXT AppKit [Add94] паттерн мост используется при реализа­ции и отображении графических изображений. Рисунок может быть представлен по-разному. Оптимальный способ его отображения на экране зависит от свойств дисплея и прежде всего от числа цветов и разрешения. Если бы не AppKit, то для каждого приложения разработчикам пришлось бы самостоятельно выяснять, какой реализацией пользоваться в конкретных условиях.

AppKit предоставляет мост NXImage/NXImageRep. Класс NXImage определяет интерфейс для обработки изображений. Реализация же определена в отдельной иерар­хии классов NXImageRep, в которой есть такие подклассы, как NXEPSImageRep, NXCachedlmageRep и NXBitMapImageRep. В классе NXImage хранятся ссылки на один или более объектов NXImageRep. Если имеется более одной реализации изображения, то NXImage выбирает самую подходящую для данного дисплея. При необходимости NXImage также может преобразовать изображение из одного фор­мата в другой. Интересная особенность этого варианта моста в том, что NXImage может одновременно хранить несколько реализаций NXImageRep.

Родственные паттерны

Паттерн абстрактная фабрика может создать и сконфигурировать мост.

Для обеспечения совместной работы не связанных между собой классов преж­де всего предназначен паттерн адаптер. Обычно он применяется в уже готовых системах. Мост же участвует в проекте с самого начала и призван поддержать воз­можность независимого изменения абстракций и их реализаций.




Дата добавления: 2015-09-11; просмотров: 76 | Поможем написать вашу работу | Нарушение авторских прав

Порождающие паттерны | Паттерн Singleton | Обсуждение порождающих паттернов | Глава 4. Структурные паттерны | Паттерн Adapter | Структурные паттерны | Результаты | Паттерн Adapter | Структурные паттерны | Мотивация |


lektsii.net - Лекции.Нет - 2014-2025 год. (0.008 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав