Адаптер (Adapter)

Материал из Вики ИТ мехмата ЮФУ
Версия от 20:39, 2 августа 2014; Admin (обсуждение | вклад) (Другое название)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

К основной странице курса

Другое название

Wrapper (обертка)

Назначение

Адаптирует интерфейс одного класса к другому. Обеспечивает совместную работу классов с несовместимыми интерфейсами.

Описание

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

Использование

Паттерн Адаптер используется когда:

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

Реализация

Диаграмма классов

AdapterCommon.png

Участники

  • Target - целевой объект

Определяет зависящий от предметной области интерфейс, которым пользуется Client

  • Client - клиент

Работает с объектами, удовлетворяющими интерфейсу Target

  • Adaptee - адаптируемый класс

Определяет существующий интерфейс, который нуждается в адаптации

  • Adapter - адаптер

Адаптирует интерфейс Adaptee к интерфейсу Target

Пример

class Client
{
    static void ClientMethod(Target t)
    {
        t.Request();
    }
    static void Main()
    {
        Adaptee a = new Adaptee();
        ClientMethod(new Adapter(a)); // Адаптер позволяет передавать объект типа Adaptee в ClientMethod
    }
}

interface Target
{
    void Request();
}

class Adapter : Target
{
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee)
    {
        this.adaptee = adaptee;
    }
    public void Request()
    {
        adaptee.SpecificRequest();
    }
}

class Adaptee
{
    public void SpecificRequest()
    {
        Console.WriteLine("SpecificRequest()");
    }
}

Достоинства и недостатки

  • Повышает степень повторного использования кода.
  • Адаптер должен обеспечить, чтобы выполнялись все требования для вызовов методов адаптируемого объекта - например, инициализация некоторых параметров. Это усложняет реализацию.
  • Иногда трудно транслировать параметры адаптера в параметры адаптируемого объекта.

Варианты

  • Адаптер может адаптировать несколько адаптируемых объектов. Эти объекты могут быть связаны иерархией наследования либо быть неродственными объектами.
  • Динамическая подгрузка адаптера во время работы приложения.
  • Двусторонние адаптеры, которые адаптируют интерфейсы двух объектов друг к другу.