Які типи адаптерів існують?
Існує три основних типи адаптерів: класовий, об'єктний і двосторонній. Кожен реалізує ідею сумісності по-своєму.
1. Класовий адаптер (Class Adapter)
Реалізується за допомогою успадкування: адаптер успадковує інтерфейс клієнта і водночас успадковує (або реалізує) адаптований клас. Використовується там, де мова підтримує множинне успадкування (наприклад, C++).
Схема: Клієнт → Adapter (успадковує Target і Adaptee) → Adaptee
Особливості:
- Висока продуктивність (немає делегування).
- Не можна застосувати, якщо немає множинного успадкування.
- Жорстка зв'язаність з адаптованим класом.
Приклад (C++):
class Adapter : public Target, private Adaptee {
public:
void request() override {
specificRequest();
}
};2. Об'єктний адаптер (Object Adapter)
Використовує композицію: адаптер містить всередині посилання на адаптований об'єкт і делегує йому виклики. Це найпоширеніший варіант у Java, C#, Python.
Схема: Клієнт → Adapter (містить Adaptee) → Adaptee
Особливості:
- Гнучкість: можна адаптувати різні об'єкти під час виконання.
- Менше зв'язаності (адаптер не залежить від конкретного класу).
- Трохи вищі накладні витрати через делегування.
Приклад (Java):
class Adapter implements Target {
private Adaptee adaptee = new Adaptee();
public void request() {
adaptee.specificRequest();
}
}3. Двосторонній адаптер (Two-Way Adapter)
Дозволяє взаємну сумісність: клієнт може працювати і через інтерфейс Target, і через Adaptee.
Тобто один і той самий адаптер уміє перетворювати виклики в обидва боки.
Використовується:
- при інтеграції двох старих систем, де обидві сторони потрібно «подружити»;
- у мережевих протоколах, API-шлюзах, драйверах.
Особливості:
- Складніша реалізація.
- Часто застосовується на рівнях middleware та в двонаправлених інтерфейсах.
4. Висновок
| Тип адаптера | Принцип | Зв'язок з Adaptee | Переваги | Недоліки |
|---|---|---|---|---|
| Класовий | Успадкування | Жорсткий | Швидше, простіше | Негнучкий, вимагає множинного успадкування |
| Об'єктний | Композиція | Посилання | Гнучкий, безпечний | Повільніше, більше коду |
| Двосторонній | Обидві сторони | Взаємний | Універсальний | Складний у реалізації |
Підсумок: Класовий - швидкий, але жорсткий. Об'єктний - гнучкий і безпечний (найпоширеніший). Двосторонній - універсальний, але складний.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.