Яка різниця між моделями дизайну "Фасад", "Проксі", "Адаптер" та "Декоратор"?
Я ніколи не читав чіткого пояснення, що твоє?
Яка різниця між моделями дизайну "Фасад", "Проксі", "Адаптер" та "Декоратор"?
Я ніколи не читав чіткого пояснення, що твоє?
Відповіді:
Адаптер адаптує заданий клас / об'єкт до нового інтерфейсу. У випадку з попередніми зазвичай застосовується багатократне успадкування. В останньому випадку об'єкт загортається відповідним адаптерним об'єктом і передається навколо. Проблема, яку ми тут вирішуємо, - це несумісні інтерфейси .
Фасад більше схожий на простий шлюз до складного набору функціоналу. Ви робите чорну скриньку, щоб ваші клієнти менше турбувалися, тобто спрощували інтерфейси .
Проксі надає той самий інтерфейс, що і для класу proxied для класу, і, як правило, робить деякі речі по господарству самостійно. (Отже, замість того, щоб робити кілька копій важкого об'єкта, X
ви робите копії легкого проксі-сервера, P
який, в свою чергу, керує X
та переводить ваші дзвінки за потребою.) Ви вирішуєте проблему клієнта від необхідності керувати важким та / або складним об'єктом .
Декоратор використовується для додавання більшої кількості пороху до ваших об'єктів (зверніть увагу на термін "об'єкти", як правило, ви декоруєте об'єкти динамічно під час виконання). Ви не приховуєте / не пошкоджуєте існуючі інтерфейси об'єкта, а просто розширюєте їх під час виконання .
Тепер, коли ви залучили декоратора, ви, ймовірно, захочете дізнатися, чому наголос на об’єкті слова - деякі мови (як-от Java) просто не дозволяють віртуальному успадкуванню (тобто багатократному успадкуванню, як це робить C ++), щоб дозволити вам це зробити в час складання.
Оскільки ми затягнули декілька спадків (і жахливий алмаз), ви будете шукати міксин - які впорядковані лінійними ланцюжками інтерфейсів, щоб вирішити проблеми багаторазового успадкування. Однак міксини не так добре змішуються. І ми закінчуємо рисами - так, ті маленькі краплинки поведінки, які ви бачите весь час у параметрі шаблону в C ++. Риси намагаються вирішувати питання композиції та декомпозиції поведінки на вишуканий спосіб, не збираючись ні для множинних спадок, ні для впорядкованого прикування.
Фасад
Наприклад, ви можете використовувати фасад, щоб полегшити дзвінки в API. Погляньте на цей приклад віддаленого фасаду. Ідея тут полягає в тому, що повна реалізація коду на сервері прихована від клієнта. Клієнт викликає 1 метод API, який, в свою чергу, може робити 1 або більше викликів API на сервері.
Перехідник
Хороший приклад цього можна знайти тут , у Вікіпедії. Клієнтський об'єкт Source
хотів би викликати метод на іншому об'єкті Target
, але інтерфейс іншого об'єкта відрізняється від того, що очікує клієнт.
Введіть об’єкт адаптера.
Він може приймати виклик від Source
об'єкта і, за лаштунками, викликати Target
метод, який слід використовувати.
Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)
Що стосується проксі, то я не маю досвіду цього дизайнерського шаблону.