Я читал оба определения, и они кажутся вполне тем же. Кто-либо мог указать на то, что их различия?
Спасибо
На вики-странице Facade Pattern есть краткое замечание по этому поводу.
"Адаптер используется, когда обертка должна соблюдать определенный интерфейс и должна поддерживать полиморфное поведение. С другой стороны, фасад используется, когда требуется более простой или более простой интерфейс для работы."
Я слышал аналогию, что вы должны думать о вашем универсальном пульте дистанционного управления, который вы настроили для работы со всеми вашими различными стереосистемами - вы нажимаете "on", и он включает ваш кабельный бокс, ваш ресивер и ваш телевизор. Может быть, это действительно модный домашний кинотеатр, и он также приглушает свет и натягивает шторы. Это фасад - одна кнопка/функция, которая выполняет более сложный набор действий.
Шаблон Adapter просто связывает два несовместимых интерфейса.
EDIT: Быстрой аналогией для паттерна Adapter (на основе комментариев) может быть что-то вроде адаптера DVI-to-VGA. Современные видеокарты часто имеют DVI, но у вас есть старый монитор VGA. С помощью адаптера, который подключается к предполагаемому входу DVI вашей видеокарты и имеет собственный вход VGA, вы сможете заставить старый монитор работать с новой видеокартой.
Адаптер обеспечивает совместную работу двух интерфейсов.
Фасад предоставляет отдельный класс более высокому и более ограниченному уровню. Например, фасад модели представления может предоставлять только определенные свойства только для чтения класса более низкого уровня.
Фасад предназначен для организации нескольких сервисов за одним сервисным шлюзом. Адаптер предназначен для использования известного интерфейса для доступа к неизвестному.
Шаблон адаптера позволяет двум, ранее несовместимым, интерфейсам работать друг с другом. Имеет 2 отдельных интерфейса.
Паттерн Фасад берет известный интерфейс, который является низкоуровневым / мелкозернистым, и объединяет его с более высокоуровневым / детализированным интерфейсом. Имеет единый интерфейс, который был упрощен за счет объединения с другим.
Как обычно, между несколькими шаблонами существует сходство. Но я бы увидел это так:
Я постараюсь объяснить это простыми словами, без особых формальностей.
Представьте, что у вас есть классы предметной области и из пользовательского интерфейса вы хотите с ними взаимодействовать. Фасад может использоваться для предоставления функций, которые могут быть вызваны из уровня пользовательского интерфейса, чтобы уровень пользовательского интерфейса не знал ни о каких классах предметной области, кроме фасада. Это означает, что вместо вызова функций в доменных классах вы вызываете одну функцию из фасада, которая будет отвечать за вызов необходимых функций из других классов.
Адаптер, с другой стороны, можно использовать для интеграции других внешних компонентов, которые могут иметь те же функции, которые вам нужны, но их функции не вызываются одинаково. Допустим, у вас есть класс Car
в вашем домене и вы работаете с внешним поставщиком автомобилей, у которого также определен класс Car. В этом классе у вас есть функция car.getDoors ()
, но у внешнего провайдера есть эквивалент car.getNumDoors ()
. Вы не хотите изменять способ вызова этой функции, поэтому вы можете использовать класс адаптера для обертывания внешнего класса Car, чтобы вызов getDoors ()
адаптера делегировался getNumDoors ()
внешнего класса.
Адаптер == вставка квадратного штифта в круглое отверстие.
Фасад == единая панель управления для запуска всех внутренних компонентов.
Я читал оба определения, и они кажутся совершенно одинаковыми.
Правда?
Я заметил, что термин Адаптер иногда используется для описания того, что на самом деле является Stategy , возможно, потому, что это слово более выразительно.
Например, в Zend Framework все классы Адаптера на самом деле являются реализациями шаблона Стратегия , потому что они только оборачивают собственный код за классами, иметь несколько моделей поведения.
Адаптеры часто используются для обертывания устаревшего или «старого» кода.
Честно говоря, многие шаблоны можно реализовать одинаково программно - разница только в намерениях.
Шаблон проектирования адаптера предназначен для «перевода» интерфейса одного или нескольких классов в интерфейс, который ожидает использовать клиент - адаптер переводит вызовы ожидаемого интерфейса в реальный интерфейс, который используют обернутые классы.
Паттерн Фасад используется, когда требуется более простой интерфейс (и, опять же, он может быть реализован таким же образом, обернув проблемные классы). Вы бы не сказали, что используете фасад, когда существующий интерфейс несовместим, просто когда вам нужно сделать его более читабельным, менее плохо оформленным и т. д.