21
May
2007

Паттерн Adapter (Адаптер)

Posted in: Паттерны проектирования |

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

Object Adapter достигает своей цели с помощью композиции. На диаграмме, представленной ниже, клиенту требуется использовать интерфейс TargetInterface. Для этого создается класс ObjectAdapter, который реализует интерфейс TargetInterface, а также хранит объект класса Adaptee. При вызове метода targetMethod у Адаптера, осуществляется вызов соответствующего метода у адаптируемого интерфейса.
Object Adapter
В самом простом случае реализация ObjectAdapter будет такой:

public class ObjectAdapter implements TargetInterface {
    private Adaptee adaptee;

    public void targetMethod() {
        adaptee.method()
    }
}

Плюс такого подхода в том, что мы полностью отделяем клиентский интерфейс от адаптируемого интерфейса.

В случае с Class Adapter’ом, для достижения нашей цели используется множественное наследование. Наш ClassAdapter наследуется от клиентского интерфейса и от Адаптируемого интерфейса. Так как в Java нет множественного наследования, то только один из предков может быть абстрактным/конкретным классом.
Class Adapter
Вот тривиальная реализация класса ClassAdapter:

public class ClassAdapter extends Adaptee
        implements TargetInterface {
    public void targetMethod() {
        method();
    }
}

Хочу обратить ваше внимание, что при такой реализации адаптера может возникнуть конфликт сигратур методов. Такой проблемы у Object Adapter нету.
Class Adapter считается более простым решением в случае когда не требуется жесткого разделения клиентского и адаптируемого интерфейсов.

Теперь хочу сказать несколько слов по поводу паттерна Фасад, который как и Адаптер является Wrapper’ом. Facade определяет новый интерфейс, в то время как Адаптер использует существующие интерфейсы.
Не стоит сравнивать Фасад и Адаптер так: мол, Фасад может оборачивать несколько классов, а Адаптер адаптирует только один. Очень может быть, что Адаптер понадобится для адаптации нескольких классов и наоборот, Фасад придется использовать для упрощения всего лишь одного комплексного класса. Так что разница этих двух паттернов не в количестве оборачиваемых сущностей, а в том, для чего они это делают.

Позже выложу код использования Адаптеров из реальных проектов, а пока жду ваших вопросов и комментариев. Удачи.

3 Comments »

RSS feed for comments on this post.



Raman
May 13, 2008 #

Да, наглядный код (а еще демонстрирования на нем разницы с Facade) был бы оочень кстати :)

Ivan
August 5, 2009 #

Паттерн Decorator также является Wrapper’ом. Decorator предназначен для расшерения функциональности. Отличается от Facade и Adapter тем, что вообще не изменяет интерфейса объекта.

Ivan
August 5, 2009 #

расшИрения

Leave a comment

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong> <pre>