Адаптер (шаблон проектування)
Адаптер, Adapter — структурний шаблон проектування, призначений для організації використання функцій об'єкта, недоступного для модифікації, через спеціально створений інтерфейс.
Зміст |
[ред.] Призначення
Адаптує інтерфейс одного класу в інший, очікуваний клієнтом. Адаптер забезпечує роботу класів з несумісними інтерфейсами, та найчастіше застосовується тоді, коли система підтримує необхідні дані і поведінку, але має невідповідний інтерфейс.
[ред.] Застосування
Адаптер передбачає створення класу-оболонки з необхідним інтерфейсом.
[ред.] Структура
[ред.] Учасники
Клас Adapter приводить інтерфейс класу Adaptee у відповідність з інтерфейсом класу Target (спадкоємцем якого є Adapter). Це дозволяє об'єктові Client використовувати об'єкт Adaptee так, немов він є екземпляром класу Target.
[ред.] Наслідки
Шаблон Адаптер дозволяє включати вже існуючі об'єкти в нові об'єктні структури, незалежно від відмінностей в їхніх інтерфейсах.
[ред.] Реалізація
Включення вже існуючого класу в інший клас. Інтерфейс включаючого класу приводиться у відповідність з новими вимогами, а виклики його методів перетворяться у виклики методів включеного класу.
[ред.] Приклад С++
#include <string> #include <iostream> // Target class CShape { public: virtual ~CShape() {}; virtual void Draw() { std::cout << "Rectangle" << std::endl; }; }; // Adaptee class CTextViewer { public: CTextViewer() {}; virtual ~CTextViewer() {}; void DrawText() { std::cout << "Text" << std::endl; }; }; // Adapter class CTextShape: public CShape, protected CTextViewer { public: CTextShape() {}; virtual ~CTextShape() {}; virtual void Draw() { DrawText(); // Call Adaptee function }; }; // Client void DrawObject(CShape* p) { p->Draw(); } int main() { // Create adapter and draw a object CShape* obj = new CTextShape(); DrawObject(obj); delete obj; return 0; }
[ред.] Зауваження і коментарі
Шаблон Адаптер дозволяє в процесі проектування не приймати до уваги можливі відмінності в інтерфейсах вже існуючих класів. Якщо є клас, що володіє необхідними методами і властивостями (принаймні, концептуально), то при необхідності завжди можна скористатися шаблоном Адаптер для приведення його інтерфейсу до потрібного вигляду.
Близьким Адаптеру є шаблон Фасад, не завжди можна відрізнити один від другого[1].
[ред.] Відомі застосування
Типовим прикладом використання шаблону Адаптер можна назвати створення класів, що приводять до єдиного інтерфейсу функції мови PHP що забезпечують доступ до різних СУБД[2].
[ред.] Примітки
- ↑ Різниця полягає в тому, що шаблон Фасад призначений для спрощення інтерфейсу, тоді як шаблон Адаптер призначений для приведення різних існуючих інтерфейсів до єдиного необхідного вигляду.
- ↑ В мові PHP доступ до СУБД реалізований у вигляді набору функцій, для кожної СУБД вони мають різні найменування і, іноді, різний набір використовуваних параметрів, що приводить до значних проблем при переході з однією СУБД на іншу, якщо такий перехід наперед не забезпечений використанням шаблону Адаптер.
[ред.] Джерела
[ред.] Література
Алан Шаллоуей, Джеймс Р. Тротт Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию = Design Patterns Explained: A New Perspective on Object-Oriented Design. — М.: «Вильямс», 2002. — 288 с. — ISBN 0-201-71594-5

