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

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Назначение)
(Другое название)
 
(не показано 10 промежуточных версий этого же участника)
Строка 2: Строка 2:
 
__NOTOC__
 
__NOTOC__
 
=== Другое название ===
 
=== Другое название ===
 +
Wrapper (обертка)
 +
 
=== Назначение ===
 
=== Назначение ===
Адаптирует интерфейс одного класса к другому.
+
Адаптирует интерфейс одного класса к другому. Обеспечивает совместную работу классов с несовместимыми интерфейсами.
  
 
=== Описание ===
 
=== Описание ===
 +
Иногда класс, спроектированный для повторного использования, не удается использовать только потому, что его интерфейс не соответствует интерфейсу, используемому в конкретном приложении. В этом случае создается класс адаптера с интерфейсом, требуемым конкретным приложением, ему передается адаптируемый объект и интерфейс адаптера реализуется вызовом методов адаптируемого объекта.
 +
===Использование ===
 +
Паттерн Адаптер используется когда:
 +
* Требуется использовать существующий класс, но его интерфейс не соответствует нашим потребностям.
 +
* Требуется создать повторно используемый класс, взаимодействующий с заранее неизвестными классами, имеющими несовместимые интерфейсы
  
 
=== Реализация ===
 
=== Реализация ===
 
==== Диаграмма классов ====
 
==== Диаграмма классов ====
[[Изображение:Common.png]]
+
[[Изображение:AdapterCommon.png]]
  
 
==== Участники====
 
==== Участники====
*  
+
* '''Target''' - целевой объект
 +
Определяет зависящий от предметной области интерфейс, которым пользуется Client
 +
* '''Client''' - клиент
 +
Работает с объектами, удовлетворяющими интерфейсу Target
 +
* '''Adaptee''' - адаптируемый класс
 +
Определяет существующий интерфейс, который нуждается в адаптации
 +
* '''Adapter''' - адаптер
 +
Адаптирует интерфейс Adaptee к интерфейсу Target
  
 
=== Пример ===
 
=== Пример ===
 
<source lang="Csharp">
 
<source lang="Csharp">
 +
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()");
 +
    }
 +
}
 
</source>
 
</source>
  
 
=== Достоинства и недостатки ===
 
=== Достоинства и недостатки ===
*  
+
* Повышает степень повторного использования кода.
 +
* Адаптер должен обеспечить, чтобы выполнялись все требования для вызовов методов адаптируемого объекта - например, инициализация некоторых параметров. Это усложняет реализацию.
 +
* Иногда трудно транслировать параметры адаптера в параметры адаптируемого объекта.
  
 
=== Варианты ===
 
=== Варианты ===
*
+
* Адаптер может адаптировать несколько адаптируемых объектов. Эти объекты могут быть связаны иерархией наследования либо быть неродственными объектами.
 +
* Динамическая подгрузка адаптера во время работы приложения.
 +
* Двусторонние адаптеры, которые адаптируют интерфейсы двух объектов друг к другу.

Текущая версия на 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()");
    }
}

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

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

Варианты

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