Evgenii Legotckoi
Evgenii Legotckoi21 вересня 2018 р. 07:11

Структурні шаблони проектування - Адаптер

Голи

  1. Перетворення інтерфейсу класу на інший інтерфейс. Адаптер дозволяє класам працювати разом, що інакше могло бути пов'язане з несумісними інтерфейсами класів.
  2. Обертання існуючого класу на новий інтерфейс
  3. Відповідність старого компонента новій системі

Проблеми

Вже готовий компонент має все необхідне розробки вашої системи, але його інтерфейси несумісні з інтерфейсами класів вашого докладання.


Обговорення

Повторне використання завжди було болючим. Однією з причин була проблема створення чогось нового, при повторному використанні чогось старого. Між старим та новим завжди є щось не зовсім правильне чи не зовсім сумісне. Це може бути фізичні розміри. Це може бути синхронізація. Це можуть бути невдалі припущення чи конкуруючі стандарти.

Це схоже на проблему вставки нового триштирькового електричного штепселя в стару двоштиркову розетку - необхідний адаптер або посередник.

Адаптер - це створення проміжної абстракції, яка переводить чи зіставляє старий компонент у нову систему. Клієнти викликають методи об'єкта 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".

Контрольний список

  1. Визначте гравців: компонент (и), які хочете використовувати (тобто клієнт), та компонент, який необхідно адаптувати (наприклад, що адаптується).
  2. Визначте інтерфейс, який потрібний клієнту.
  3. Створіть клас обгортка, який може відповідати інтерфейсу клієнта.
  4. Клас адаптера/обгортки «має» екземпляр класу, що адаптується.
  5. Клас адаптера/обгортки «порівняє» інтерфейс клієнта з адаптованим інтерфейсом.
  6. Клієнт використовує новий інтерфейс

Емпіричні правила

  • Адаптер дозволяє працювати класам після того, як вони розроблені; Міст змушує їх працювати до того, як вони будуть розроблені.
  • Міст розроблений заздалегідь, щоб абстракція та реалізація змінювалися незалежно. Адаптер модернізує, щоби спільні класи працювали разом.
  • Адаптер надає інший інтерфейс свого об'єкта. Проксі забезпечує той самий інтерфейс. Декоратор забезпечує розширений інтерфейс.
  • Адаптер призначений зміни інтерфейсу існуючого об'єкта. Декоратор покращує роботу іншого об'єкта без зміни його інтерфейсу. Таким чином, декоратор більш прозорий для застосування, ніж адаптер. Як наслідок Декоратор підтримує рекурсивну композицію, що неможливо при використанні чистих адаптерів.
  • Фасад визначає новий інтерфейс, тоді як Adapter використовує старий інтерфейс. Пам'ятайте, що адаптер підтримує два існуючі інтерфейси, а не визначає абсолютно новий.
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 08:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 08:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 19:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 21:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 15:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 14:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 18:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 22:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 14:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 10:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 16:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Слідкуйте за нами в соціальних мережах