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