- 1. Голи
- 2. Проблеми
- 3. Обговорення
- 4. Структура
- 5. Приклад
- 6. Контрольний список
- 7. Емпіричні правила
Голи
- Перетворення інтерфейсу класу на інший інтерфейс. Адаптер дозволяє класам працювати разом, що інакше могло бути пов'язане з несумісними інтерфейсами класів.
- Обертання існуючого класу на новий інтерфейс
- Відповідність старого компонента новій системі
Проблеми
Вже готовий компонент має все необхідне розробки вашої системи, але його інтерфейси несумісні з інтерфейсами класів вашого докладання.
Обговорення
Повторне використання завжди було болючим. Однією з причин була проблема створення чогось нового, при повторному використанні чогось старого. Між старим та новим завжди є щось не зовсім правильне чи не зовсім сумісне. Це може бути фізичні розміри. Це може бути синхронізація. Це можуть бути невдалі припущення чи конкуруючі стандарти.
Це схоже на проблему вставки нового триштирькового електричного штепселя в стару двоштиркову розетку - необхідний адаптер або посередник.
Адаптер - це створення проміжної абстракції, яка переводить чи зіставляє старий компонент у нову систему. Клієнти викликають методи об'єкта Adapter, які перенаправляють їх у виклики успадкованого компонента. Ця стратегія може бути реалізована або з наслідуванням, або з агрегацією.
Адаптер функціонує як оболонка чи модифікатор існуючого класу. Він надає інше або перекладене уявлення цього класу.
Структура
Нижче застарілий метод display() для компонента Rectangle, який використовується в Rectangle, розраховує отримати параметри «x, y, w, h». Але клієнт хоче передати «верхні ліві x та y» та «нижні праві x і y». Ця неузгодженість може бути виправлена шляхом додавання додаткового рівня абстракції – тобто об'єкта адаптера.
Адаптер також можна розглядати як «обгортку».
Приклад
Шаблон адаптера дозволяє іншим несумісним класам працювати разом, перетворюючи інтерфейс одного класу на інтерфейс, очікуваний клієнтами. Сокети з гніздами є прикладом адаптера. Розетка прикріплюється до храповика за умови, що розмір приводу однаковий. Типові розміри дисків у США становлять 1/2" та 1/4". Очевидно, що храповий механізм 1/2 "не входитиме в гніздо 1/4", якщо адаптер не використовується. Адаптер з діагоналлю від 1/2 дюйма до 1/4" має 1/2" гніздове з'єднання для кріплення на шейкер 1/2" та 1/4" штире з'єднання для установки в гніздо 1/4".
Контрольний список
- Визначте гравців: компонент (и), які хочете використовувати (тобто клієнт), та компонент, який необхідно адаптувати (наприклад, що адаптується).
- Визначте інтерфейс, який потрібний клієнту.
- Створіть клас обгортка, який може відповідати інтерфейсу клієнта.
- Клас адаптера/обгортки «має» екземпляр класу, що адаптується.
- Клас адаптера/обгортки «порівняє» інтерфейс клієнта з адаптованим інтерфейсом.
- Клієнт використовує новий інтерфейс
Емпіричні правила
- Адаптер дозволяє працювати класам після того, як вони розроблені; Міст змушує їх працювати до того, як вони будуть розроблені.
- Міст розроблений заздалегідь, щоб абстракція та реалізація змінювалися незалежно. Адаптер модернізує, щоби спільні класи працювали разом.
- Адаптер надає інший інтерфейс свого об'єкта. Проксі забезпечує той самий інтерфейс. Декоратор забезпечує розширений інтерфейс.
- Адаптер призначений зміни інтерфейсу існуючого об'єкта. Декоратор покращує роботу іншого об'єкта без зміни його інтерфейсу. Таким чином, декоратор більш прозорий для застосування, ніж адаптер. Як наслідок Декоратор підтримує рекурсивну композицію, що неможливо при використанні чистих адаптерів.
- Фасад визначає новий інтерфейс, тоді як Adapter використовує старий інтерфейс. Пам'ятайте, що адаптер підтримує два існуючі інтерфейси, а не визначає абсолютно новий.