May
Паттерн Adapter (Адаптер)
Posted in: Паттерны проектирования |
Вернемся к рассмотрению структурных паттернов проектирования. На этот раз мы рассмотрим шаблон проектирования под названием Adapter (его еще называют Wrapper на ряду с паттерном Facade).
Итак, паттерн Adapter используется для того, чтобы объекты с разными интерфейсами могли работать друг с другом. Существует два типа адаптеров - Class Adapter и Object Adapter.
Для начала мы рассмотрим каждый из этих типов, а потом я объясню разницу между двумя wrapper’ами - адаптером и фасадом.
Object Adapter достигает своей цели с помощью композиции. На диаграмме, представленной ниже, клиенту требуется использовать интерфейс TargetInterface. Для этого создается класс ObjectAdapter, который реализует интерфейс TargetInterface, а также хранит объект класса Adaptee. При вызове метода targetMethod у Адаптера, осуществляется вызов соответствующего метода у адаптируемого интерфейса.

В самом простом случае реализация ObjectAdapter будет такой:
public class ObjectAdapter implements TargetInterface {
private Adaptee adaptee;
public void targetMethod() {
adaptee.method()
}
}
Плюс такого подхода в том, что мы полностью отделяем клиентский интерфейс от адаптируемого интерфейса.
В случае с Class Adapter’ом, для достижения нашей цели используется множественное наследование. Наш ClassAdapter наследуется от клиентского интерфейса и от Адаптируемого интерфейса. Так как в Java нет множественного наследования, то только один из предков может быть абстрактным/конкретным классом.

Вот тривиальная реализация класса ClassAdapter:
public class ClassAdapter extends Adaptee
implements TargetInterface {
public void targetMethod() {
method();
}
}
Хочу обратить ваше внимание, что при такой реализации адаптера может возникнуть конфликт сигратур методов. Такой проблемы у Object Adapter нету.
Class Adapter считается более простым решением в случае когда не требуется жесткого разделения клиентского и адаптируемого интерфейсов.
Теперь хочу сказать несколько слов по поводу паттерна Фасад, который как и Адаптер является Wrapper’ом. Facade определяет новый интерфейс, в то время как Адаптер использует существующие интерфейсы.
Не стоит сравнивать Фасад и Адаптер так: мол, Фасад может оборачивать несколько классов, а Адаптер адаптирует только один. Очень может быть, что Адаптер понадобится для адаптации нескольких классов и наоборот, Фасад придется использовать для упрощения всего лишь одного комплексного класса. Так что разница этих двух паттернов не в количестве оборачиваемых сущностей, а в том, для чего они это делают.
Позже выложу код использования Адаптеров из реальных проектов, а пока жду ваших вопросов и комментариев. Удачи.
1 Comment »
RSS feed for comments on this post.
Да, наглядный код (а еще демонстрирования на нем разницы с Facade) был бы оочень кстати ![]()