Я читал оба определения, и они кажутся совершенно одинаковыми. Может ли кто-нибудь указать, в чем их отличия?
Спасибо
Я читал оба определения, и они кажутся совершенно одинаковыми. Может ли кто-нибудь указать, в чем их отличия?
Спасибо
В этой вики-странице на странице вики-страницы содержится краткая заметка об этом.
"Адаптер используется, когда обертка должен уважать конкретный интерфейс и должен поддерживать полиморфный поведение. С другой стороны, фасад используется, когда требуется более простой или более простой интерфейс для работы с."
Я слышал аналогию о том, что вы должны думать о своем универсальном пульте дистанционного управления, который вы настроили для работы со всеми вашими стереосистемами - вы нажимаете "on", и он включает ваш кабель, ваш ресивер и телевизор, Может быть, это действительно причудливый домашний кинотеатр, и он тускнет свет и рисует оттенки. Это Facade - одна кнопка/функция, которая выполняет более сложный набор шагов.
Шаблон адаптера просто связывает два несовместимых интерфейса.
EDIT: Быстрая аналогия шаблона адаптера (на основе комментариев) может быть чем-то вроде адаптера DVI-to-VGA. Современные видеокарты часто являются DVI, но у вас есть старый монитор VGA. С адаптером, который подключается к вашей видеокарте, ожидается вход DVI и имеет свой собственный вход VGA, вы сможете заставить свой старый монитор работать с новой видеокартой.
Адаптер == превращает квадратный штифт в круглое отверстие.
Facade == отдельная панель управления для запуска всех внутренних компонентов.
Честно говоря, многие шаблоны могут быть реализованы одинаково программно - разница в намерении.
Шаблон проектирования адаптера предназначен для "перевода" интерфейса одного или нескольких классов в интерфейс, который клиент ожидает использовать - адаптер переводит вызовы на ожидаемый интерфейс в фактический интерфейс, который используют обернутые классы.
Шаблон Facade используется, когда требуется более простой интерфейс (и, опять же, может быть реализован таким же образом путем обертывания классов-нарушителей.) Вы не сказали бы, что используете фасад, когда существующий интерфейс несовместим, просто когда вам нужно сделать его более читаемым, менее плохо спроектированным и т.д.
Фасад предназначен для организации нескольких служб за единственным шлюзом службы. Адаптер предназначен для предоставления возможности использования известного интерфейса для доступа к неизвестному.
Фасад:
Основные выводы: (из journaldev статьи Панкаджа Кумара)
Диаграмма классов фасадов:
Адаптер:
Диаграмма классов Адаптера:
Вы можете найти более подробную информацию об адаптере в этом сообщении SE:
Разница между шаблоном моста и шаблоном адаптера
Ключевые отличия:
Посмотрите на статью sourcemaking, чтобы лучше понять.
Фасад обычно контрастирует с адаптером.
+--------------------------------------------------------------+-----------------------------------------------+
| Facade | Adapter |
+--------------------------------------------------------------+-----------------------------------------------+
| Simplifies multiple complex components with single interface | Provides differnet interface for an interface |
| Works with multiple components | Works with single component |
| Control panel is an example | A power adapter is an example |
| High-level interface | Low-level interface |
+--------------------------------------------------------------+-----------------------------------------------+
Как обычно, существуют сходства между несколькими шаблонами. Но я бы увидел это так:
Я попытаюсь объяснить это простыми словами, без большой формальности.
Представьте, что у вас есть некоторые классы домена и пользовательский интерфейс, с которым вы хотите взаимодействовать. Фасад может использоваться для предоставления функций, которые могут быть вызваны из слоя пользовательского интерфейса, чтобы слой пользовательского интерфейса не знал о каких-либо классах домена, отличных от фасада. Это означает, что вместо вызова функций в классах домена вы вызываете одну функцию из фасада, которая будет отвечать за вызов необходимых функций из других классов.
Адаптер, с другой стороны, может быть использован для интеграции других внешних компонентов, которые могут обладать одинаковой функциональностью, но их функции не называются совершенно одинаково. Скажите, что у вас есть класс Car
в вашем домене, и вы работаете с внешним поставщиком автомобилей, который также имеет класс Car. В этом классе у вас есть функция car.getDoors()
, но внешний поставщик имеет эквивалент car.getNumDoors()
. Вы не хотите изменять способ вызова этой функции, поэтому вы можете использовать класс адаптера для переноса внешнего класса Car, чтобы вызов getDoors()
адаптера был делегирован getNumDoors()
внешнего класса.
Цель
фасад это простота
адаптер совместимости.
Шаблон адаптера позволяет двум, ранее несовместимым интерфейсам работать друг с другом. Имеет 2 отдельных интерфейса в игре.
Шаблон Facade принимает известный интерфейс, который является низким уровнем/мелкозернистым, и обертывает его более высоким уровнем/конечно зернистым интерфейсом. Имеет один интерфейс, который был упрощен путем переноса на другой.
Адаптер объединяет два интерфейса.
Фасад выставляет один класс на более высокий и более ограниченный уровень. Например, фасад модели представления может отображать только определенные свойства только для чтения класса более низкого уровня.
Я читал оба определения, и они кажутся совершенно одинаковыми.
Действительно?
Я заметил, что термин Adapter иногда используется для описания того, что на самом деле является Stategy, может быть потому, что слово более выразительно.
Например, в Zend Framework все классы Adapter фактически являются реализациями шаблона Strategy, потому что они только переносят собственный код за классами, чтобы иметь несколько вариантов поведения.
Адаптеры часто используются для переноса старого или старого кода.
Фасад
Абстрагирует сложность, чтобы обеспечить более простой интерфейс. Скажем, например, компьютерная ОС абстрагирует сложность базового оборудования. Или языки программирования высокого уровня (Python/JavaScript) абстрагируют сложность по сравнению с языком низкого уровня (C).
адаптер
Это аналоги аппаратных адаптеров. Скажем, вы хотите подключить USB device
к serial port
, вам понадобится USB-serial port adapter
.
Шаблон адаптера связывает два несовместимых интерфейса, предоставляя новый интерфейс.
Шаблон фасада упрощает сложную подсистему (имеющую несколько компонентов) с одним интерфейсом.