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

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

Паттерн Adapter

Читайте также:
  1. Введение в паттерны проектирования
  2. Введение в паттерны проектирования
  3. Введение в паттерны проектирования
  4. Введение в паттерны проектирования
  5. Введение в паттерны проектирования
  6. Введение в паттерны проектирования
  7. Гдд Паттерны поведения
  8. Глава 1. Введение в паттерны проектирования
  9. Глава 3. Порождающие паттерны
  10. Глава 4. Структурные паттерны

 

и адаптировать иерархически структурированный объект. Например, подкласс DirectoryTreeDisplay при их реализации будет осуществ­лять доступ к структуре каталогов файловой системы. DirectoryTreeDi splay специализирует узкий интерфейс таким обра­зом, чтобы он мог отображать структуру каталогов, составленную из объек­тов File SystemEntity;

использование объектов-уполномоченных. При таком подходе TreeDisplay переадресует запросы на доступ к иерархической структуре объекту-уполномоченному. TreeDisplay может реализовывать различные стра­тегии адаптации, подставляя разных уполномоченных. Например, предположим, что существует класс DirectoryBrowser, ко­торый использует TreeDisplay. DirectoryBrowser может быть упол­номоченным для адаптации TreeDisplay к иерархической структуре каталогов. В динамически типизированных языках вроде Smalltalk или Objective С такой подход требует интерфейса для регистрации уполно­моченного в адаптере. Тогда TreeDisplay просто переадресует запросы уполномоченному. В системе NEXTSTEP [Add94] этот подход активно используется для уменьшения числа подклассов.


В статически типизированных языках вроде C++ требуется явно опреде­лять интерфейс для уполномоченного. Специфицировать такой интер­фейс можно, поместив «узкий» интерфейс, который необходим классу TreeDisplay, в абстрактный класс TreeAccessorDelegate. После этого допустимо добавить этот интерфейс к выбранному уполномочен­ному - в данном случае DirectoryBrowser - с помощью наследования. Если у DirectoryBrowser еще нет существующего родительского клас­са, то воспользуемся одиночным наследованием, если есть - множествен­ным. Подобное смешивание классов проще, чем добавление нового под­класса и реализация его операций по отдельности;

- параметризованные адаптеры. Обычно в Smalltalk для поддержки смен­ных адаптеров параметризуют адаптер одним или несколькими блоками. Конструкция блока поддерживает адаптацию без порождения подклассов. Блок может адаптировать запрос, а адаптер может хранить блок для каж­дого отдельного запроса. В нашем примере это означает, что TreeDisplay хранит один блок для преобразования узла в GraphicNode, а другой - для доступа к потомкам узла.

Например, чтобы создать класс TreeDisplay для отображения иерар­хии каталогов, мы пишем:

directoryDisplay:=

(TreeDisplay on: treeRoot) getChiIdrenBlock:

[:node | node getSubdirectories] createGraphicNodeBlock:

[:node | node createGraphicNode].

Если вы встраиваете интерфейс адаптации в класс, то этот способ дает удобную альтернативу подклассам.

Пример кода

Приведем краткий обзор реализации адаптеров класса и объекта для при­мера, обсуждавшегося в разделе «Мотивация», при этом начнем с классов Shape и Text View:

class Shape { public:

Shape();

virtual void BoundingBox(

Points bottomLeft, Point& topRight

) const;

virtual Manipulator* CreateManipulator() const;

class TextView { public:

TextView();

void GetOrigin(Coord& x, Coords y) const;





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

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


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