Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Design Patterns via C#.pdf
Скачиваний:
154
Добавлен:
17.03.2016
Размер:
13.25 Mб
Скачать

97

Применимость паттерна

Паттерн Adapter рекомендуется использовать, когда:

Требуется использовать уже существующий класс, но его интерфейс (набор методов) не соответствует требованиям клиента.

Требуется создать повторно используемый класс который должен взаимодействовать с классами имеющими не совместимые интерфейсы.

Результаты

Варианты использования паттерна Adapter уровня классов и паттерна Adapter уровня объектов, имеют свои особенности.

Adapter уровня классов

Адаптирует интерфейс Adaptee к интерфейсу ITarget, делегируя ответственность за выполнение операций (методов) конкретному классу Adaptee.

Позволяет классу Adapter переопределить или заместить некоторые операции из базового класса

Adaptee.

Оставляет возможность создания только одного экземпляра класса Adapter, так как Adapter наследуется от Adaptee, то не придётся отдельно создавать экземпляр Adaptee внутри класса

Adapter.

Adapter уровня объектов

Позволяет одному экземпляру класса Adapter, работать с разными адаптируемыми объектами типа Adaptee, как с экземплярами класса Adaptee, так и с экземплярами классов производных от

Adaptee.

Позволяет классу Adapter расширить некоторые операции экземпляра класса Adaptee (например, в методе класса Adapter сперва выполняется некоторая своя функциональность, а после вызывается метод экземпляра класса Adaptee).

Затрудняет расширение (переопределение или замещение) защищенных виртуальных (protected virtual) и невиртуальных методов из класса Adaptee. Для расширения защищенных методов потребуется создать класс DerivedAdaptee производный от класса Adaptee, внести в него необходимые изменения и в адаптере использовать экземпляр класса DerivedAdaptee.

Особенности применения паттерна Adapter

Объем работ по адаптации.

Устройство разных адаптеров может сильно отличаться. Класс Adapter может просто изменять имена методов класса Adaptee, но может и расширять методы класса Adaptee, при этом добавляя свои новые методы с использованием которых формируется желаемый (требуемый) интерфейс взаимодействия с объектом класса Adapter.

Сменные адаптеры.

Степень многократного использования (reusable) класса «А» будет высокой, тогда и только тогда, когда разработчик класса «А» не будет делать предположений о том, какие классы будут использовать класс «А».

Встраивая механизм адаптации интерфейса (набора методов) класса Adaptee в класс Adapter, программист отказывается от предположения, что какой-либо другой класс в программе (кроме класса Adapter) будет использовать интерфейс класса Adaptee напрямую. Другими

98

словами, адаптация интерфейса (набора методов) класса Adaptee в классе Adapter, позволяет включить интерфейс Adaptee только через класс Adapter в существующую систему (программу), в которой все классы спроектированы так, что не могут воспользоваться интерфейсом класса Adaptee напрямую.

Имеется разновидность адаптеров, которые называются сменными адаптерами (pluggable adapters). Сменный адаптер, это такой адаптер PluggableAdapter, в который встроен механизм адаптации интерфейсов нескольких адаптируемых классов AdapteeA, AdapteeB и т.д.

См. Пример к главе: \006_Adapter\003_PluggableAdapter

Рассмотрим элемент управления TreeView, который отображает древовидные структуры. Разные классы имеют свои собственные интерфейсы для получения доступа к элементам древовидных структур, которые эти классы представляют.

Например, можно сравнить интерфейсы взаимодействия с классами DirectoryInfo и Assembly. Как можно убедиться, интерфейсы этих классов различны. Класс TreeView не адаптирован для работы с классами DirectoryInfo и Assembly напрямую. Клиент должен самостоятельно назначать данные узлам TreeNode, класса TreeView, для отображения этих данных в дереве. Для упрощения работы клиента, есть смысл создать пользовательский элемент управления – класс TreeDisplay, для отображения древовидных структур. Элемент управления типа TreeDisplay должен уметь отображать иерархии обоих видов древообразных структур, как DirectoryInfo, так и Assembly. Другими словами, в TreeDisplay должна быть встроена адаптация интерфейсов классов DirectoryInfo и Assembly.

См. Пример к главе: \006_Adapter\004_AdapterTreeDisplay

Двусторонние адаптеры.

Важное правило: клиент не должен знать, что используемый им объект является адаптером. Объект класса Adapter не обладает открытым интерфейсом класса Adaptee, поэтому

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]