Різниця між моделями дизайну фасаду, проксі, адаптера та декоратора? [зачинено]


135

Яка різниця між моделями дизайну "Фасад", "Проксі", "Адаптер" та "Декоратор"?

Я ніколи не читав чіткого пояснення, що твоє?



@gavenkoa інше питання стосується лише проксі та декоратора
user310291

2
Неймовірно, оскільки одне закрите питання виявляється таким корисним.
Лука

Відповіді:


285

Адаптер адаптує заданий клас / об'єкт до нового інтерфейсу. У випадку з попередніми зазвичай застосовується багатократне успадкування. В останньому випадку об'єкт загортається відповідним адаптерним об'єктом і передається навколо. Проблема, яку ми тут вирішуємо, - це несумісні інтерфейси .

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

Проксі надає той самий інтерфейс, що і для класу proxied для класу, і, як правило, робить деякі речі по господарству самостійно. (Отже, замість того, щоб робити кілька копій важкого об'єкта, Xви робите копії легкого проксі-сервера, Pякий, в свою чергу, керує Xта переводить ваші дзвінки за потребою.) Ви вирішуєте проблему клієнта від необхідності керувати важким та / або складним об'єктом .

Декоратор використовується для додавання більшої кількості пороху до ваших об'єктів (зверніть увагу на термін "об'єкти", як правило, ви декоруєте об'єкти динамічно під час виконання). Ви не приховуєте / не пошкоджуєте існуючі інтерфейси об'єкта, а просто розширюєте їх під час виконання .

Тепер, коли ви залучили декоратора, ви, ймовірно, захочете дізнатися, чому наголос на об’єкті слова - деякі мови (як-от Java) просто не дозволяють віртуальному успадкуванню (тобто багатократному успадкуванню, як це робить C ++), щоб дозволити вам це зробити в час складання.

Оскільки ми затягнули декілька спадків (і жахливий алмаз), ви будете шукати міксин - які впорядковані лінійними ланцюжками інтерфейсів, щоб вирішити проблеми багаторазового успадкування. Однак міксини не так добре змішуються. І ми закінчуємо рисами - так, ті маленькі краплинки поведінки, які ви бачите весь час у параметрі шаблону в C ++. Риси намагаються вирішувати питання композиції та декомпозиції поведінки на вишуканий спосіб, не збираючись ні для множинних спадок, ні для впорядкованого прикування.


1
HTH! Я намагався вкласти, наскільки це можливо, не надто розпливчасто. Вибачте мою нездатність зробити краще. Я читав (докторські дисертації) статті лише про ознаки. Мої знання, отже, досить обмежені, і я недостатньо хороший, щоб вписатись у всі шаблони цього простору;)
невдало

Ви передбачили майбутнє питання про міксини та риси, але я ще не бачив їх!
user310291

1
Хороше посилання на порівняння (через wikipedia) для перших трьох (Декоратор зовсім інший): NetObjectives
Liviu

@Liviu Ваше посилання мертве. Я припускаю, що ви спочатку вказували там , але тепер, здається, вміст стоїть за логіном.
Джонатан Н

@Sheljohn Посилання оновлено: p: Хороше посилання для порівняння (через вікіпедію) для перших трьох (Декоратор зовсім інший) NetObjectives (Повторний текст, див. "Betweem": "Одне з найчастіших запитань, які я отримую в класі", "що різниця між адаптером, проксі та фасадом? Вони мені справді здаються однаковими ".)
Liviu

16

Фасад

Наприклад, ви можете використовувати фасад, щоб полегшити дзвінки в API. Погляньте на цей приклад віддаленого фасаду. Ідея тут полягає в тому, що повна реалізація коду на сервері прихована від клієнта. Клієнт викликає 1 метод API, який, в свою чергу, може робити 1 або більше викликів API на сервері.

Перехідник

Хороший приклад цього можна знайти тут , у Вікіпедії. Клієнтський об'єкт Sourceхотів би викликати метод на іншому об'єкті Target, але інтерфейс іншого об'єкта відрізняється від того, що очікує клієнт.

Введіть об’єкт адаптера.

Він може приймати виклик від Sourceоб'єкта і, за лаштунками, викликати Targetметод, який слід використовувати.

Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)

Що стосується проксі, то я не маю досвіду цього дизайнерського шаблону.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.