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