Адаптер (Adapter) — различия между версиями
Admin (обсуждение | вклад) (→Описание) |
Admin (обсуждение | вклад) (→Другое название) |
||
(не показаны 4 промежуточные версии этого же участника) | |||
Строка 2: | Строка 2: | ||
__NOTOC__ | __NOTOC__ | ||
=== Другое название === | === Другое название === | ||
+ | Wrapper (обертка) | ||
+ | |||
=== Назначение === | === Назначение === | ||
Адаптирует интерфейс одного класса к другому. Обеспечивает совместную работу классов с несовместимыми интерфейсами. | Адаптирует интерфейс одного класса к другому. Обеспечивает совместную работу классов с несовместимыми интерфейсами. | ||
Строка 8: | Строка 10: | ||
Иногда класс, спроектированный для повторного использования, не удается использовать только потому, что его интерфейс не соответствует интерфейсу, используемому в конкретном приложении. В этом случае создается класс адаптера с интерфейсом, требуемым конкретным приложением, ему передается адаптируемый объект и интерфейс адаптера реализуется вызовом методов адаптируемого объекта. | Иногда класс, спроектированный для повторного использования, не удается использовать только потому, что его интерфейс не соответствует интерфейсу, используемому в конкретном приложении. В этом случае создается класс адаптера с интерфейсом, требуемым конкретным приложением, ему передается адаптируемый объект и интерфейс адаптера реализуется вызовом методов адаптируемого объекта. | ||
===Использование === | ===Использование === | ||
+ | Паттерн Адаптер используется когда: | ||
+ | * Требуется использовать существующий класс, но его интерфейс не соответствует нашим потребностям. | ||
+ | * Требуется создать повторно используемый класс, взаимодействующий с заранее неизвестными классами, имеющими несовместимые интерфейсы | ||
=== Реализация === | === Реализация === | ||
Строка 67: | Строка 72: | ||
=== Достоинства и недостатки === | === Достоинства и недостатки === | ||
− | * | + | * Повышает степень повторного использования кода. |
+ | * Адаптер должен обеспечить, чтобы выполнялись все требования для вызовов методов адаптируемого объекта - например, инициализация некоторых параметров. Это усложняет реализацию. | ||
+ | * Иногда трудно транслировать параметры адаптера в параметры адаптируемого объекта. | ||
=== Варианты === | === Варианты === | ||
− | * | + | * Адаптер может адаптировать несколько адаптируемых объектов. Эти объекты могут быть связаны иерархией наследования либо быть неродственными объектами. |
+ | * Динамическая подгрузка адаптера во время работы приложения. | ||
+ | * Двусторонние адаптеры, которые адаптируют интерфейсы двух объектов друг к другу. |
Текущая версия на 20:39, 2 августа 2014
Другое название
Wrapper (обертка)
Назначение
Адаптирует интерфейс одного класса к другому. Обеспечивает совместную работу классов с несовместимыми интерфейсами.
Описание
Иногда класс, спроектированный для повторного использования, не удается использовать только потому, что его интерфейс не соответствует интерфейсу, используемому в конкретном приложении. В этом случае создается класс адаптера с интерфейсом, требуемым конкретным приложением, ему передается адаптируемый объект и интерфейс адаптера реализуется вызовом методов адаптируемого объекта.
Использование
Паттерн Адаптер используется когда:
- Требуется использовать существующий класс, но его интерфейс не соответствует нашим потребностям.
- Требуется создать повторно используемый класс, взаимодействующий с заранее неизвестными классами, имеющими несовместимые интерфейсы
Реализация
Диаграмма классов
Участники
- 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()");
}
}
Достоинства и недостатки
- Повышает степень повторного использования кода.
- Адаптер должен обеспечить, чтобы выполнялись все требования для вызовов методов адаптируемого объекта - например, инициализация некоторых параметров. Это усложняет реализацию.
- Иногда трудно транслировать параметры адаптера в параметры адаптируемого объекта.
Варианты
- Адаптер может адаптировать несколько адаптируемых объектов. Эти объекты могут быть связаны иерархией наследования либо быть неродственными объектами.
- Динамическая подгрузка адаптера во время работы приложения.
- Двусторонние адаптеры, которые адаптируют интерфейсы двух объектов друг к другу.