Адаптер (Adapter) — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Использование)
(Другое название)
 
(не показаны 2 промежуточные версии этого же участника)
Строка 2: Строка 2:
 
__NOTOC__
 
__NOTOC__
 
=== Другое название ===
 
=== Другое название ===
 +
Wrapper (обертка)
 +
 
=== Назначение ===
 
=== Назначение ===
 
Адаптирует интерфейс одного класса к другому. Обеспечивает совместную работу классов с несовместимыми интерфейсами.
 
Адаптирует интерфейс одного класса к другому. Обеспечивает совместную работу классов с несовместимыми интерфейсами.
Строка 70: Строка 72:
  
 
=== Достоинства и недостатки ===
 
=== Достоинства и недостатки ===
*  
+
* Повышает степень повторного использования кода.
 +
* Адаптер должен обеспечить, чтобы выполнялись все требования для вызовов методов адаптируемого объекта - например, инициализация некоторых параметров. Это усложняет реализацию.
 +
* Иногда трудно транслировать параметры адаптера в параметры адаптируемого объекта.
  
 
=== Варианты ===
 
=== Варианты ===
*
+
* Адаптер может адаптировать несколько адаптируемых объектов. Эти объекты могут быть связаны иерархией наследования либо быть неродственными объектами.
 +
* Динамическая подгрузка адаптера во время работы приложения.
 +
* Двусторонние адаптеры, которые адаптируют интерфейсы двух объектов друг к другу.

Текущая версия на 20:39, 2 августа 2014

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

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

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()");
    }
}

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

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

Варианты

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