Каково различие между Фасадом и Шаблоном "адаптер"?

Я читал оба определения, и они кажутся вполне тем же. Кто-либо мог указать на то, что их различия?

Спасибо

91
задан Ravindra babu 6 June 2016 в 15:42
поделиться

9 ответов

На вики-странице Facade Pattern есть краткое замечание по этому поводу.

"Адаптер используется, когда обертка должна соблюдать определенный интерфейс и должна поддерживать полиморфное поведение. С другой стороны, фасад используется, когда требуется более простой или более простой интерфейс для работы."

Я слышал аналогию, что вы должны думать о вашем универсальном пульте дистанционного управления, который вы настроили для работы со всеми вашими различными стереосистемами - вы нажимаете "on", и он включает ваш кабельный бокс, ваш ресивер и ваш телевизор. Может быть, это действительно модный домашний кинотеатр, и он также приглушает свет и натягивает шторы. Это фасад - одна кнопка/функция, которая выполняет более сложный набор действий.

Шаблон Adapter просто связывает два несовместимых интерфейса.

EDIT: Быстрой аналогией для паттерна Adapter (на основе комментариев) может быть что-то вроде адаптера DVI-to-VGA. Современные видеокарты часто имеют DVI, но у вас есть старый монитор VGA. С помощью адаптера, который подключается к предполагаемому входу DVI вашей видеокарты и имеет собственный вход VGA, вы сможете заставить старый монитор работать с новой видеокартой.

120
ответ дан 24 November 2019 в 06:40
поделиться

Адаптер обеспечивает совместную работу двух интерфейсов.

Фасад предоставляет отдельный класс более высокому и более ограниченному уровню. Например, фасад модели представления может предоставлять только определенные свойства только для чтения класса более низкого уровня.

2
ответ дан 24 November 2019 в 06:40
поделиться

Фасад предназначен для организации нескольких сервисов за одним сервисным шлюзом. Адаптер предназначен для использования известного интерфейса для доступа к неизвестному.

11
ответ дан 24 November 2019 в 06:40
поделиться

Шаблон адаптера позволяет двум, ранее несовместимым, интерфейсам работать друг с другом. Имеет 2 отдельных интерфейса.

Паттерн Фасад берет известный интерфейс, который является низкоуровневым / мелкозернистым, и объединяет его с более высокоуровневым / детализированным интерфейсом. Имеет единый интерфейс, который был упрощен за счет объединения с другим.

2
ответ дан 24 November 2019 в 06:40
поделиться

Как обычно, между несколькими шаблонами существует сходство. Но я бы увидел это так:

  • Фасад используется для инкапсуляции всего слоя и предлагает некоторые методы для «удобного» доступа к нему
  • Используется адаптер, в котором у вас есть два компонента, которые уже должны работать вместе, но нет, только из-за "несущественных" отличий в интерфейсе.
3
ответ дан 24 November 2019 в 06:40
поделиться

Я постараюсь объяснить это простыми словами, без особых формальностей.

Представьте, что у вас есть классы предметной области и из пользовательского интерфейса вы хотите с ними взаимодействовать. Фасад может использоваться для предоставления функций, которые могут быть вызваны из уровня пользовательского интерфейса, чтобы уровень пользовательского интерфейса не знал ни о каких классах предметной области, кроме фасада. Это означает, что вместо вызова функций в доменных классах вы вызываете одну функцию из фасада, которая будет отвечать за вызов необходимых функций из других классов.

Адаптер, с другой стороны, можно использовать для интеграции других внешних компонентов, которые могут иметь те же функции, которые вам нужны, но их функции не вызываются одинаково. Допустим, у вас есть класс Car в вашем домене и вы работаете с внешним поставщиком автомобилей, у которого также определен класс Car. В этом классе у вас есть функция car.getDoors () , но у внешнего провайдера есть эквивалент car.getNumDoors () . Вы не хотите изменять способ вызова этой функции, поэтому вы можете использовать класс адаптера для обертывания внешнего класса Car, чтобы вызов getDoors () адаптера делегировался getNumDoors () внешнего класса.

3
ответ дан 24 November 2019 в 06:40
поделиться

Адаптер == вставка квадратного штифта в круглое отверстие.

Фасад == единая панель управления для запуска всех внутренних компонентов.

104
ответ дан 24 November 2019 в 06:40
поделиться

Я читал оба определения, и они кажутся совершенно одинаковыми.

Правда?

Я заметил, что термин Адаптер иногда используется для описания того, что на самом деле является Stategy , возможно, потому, что это слово более выразительно.

Например, в Zend Framework все классы Адаптера на самом деле являются реализациями шаблона Стратегия , потому что они только оборачивают собственный код за классами, иметь несколько моделей поведения.

Адаптеры часто используются для обертывания устаревшего или «старого» кода.

0
ответ дан 24 November 2019 в 06:40
поделиться

Честно говоря, многие шаблоны можно реализовать одинаково программно - разница только в намерениях.

Шаблон проектирования адаптера предназначен для «перевода» интерфейса одного или нескольких классов в интерфейс, который ожидает использовать клиент - адаптер переводит вызовы ожидаемого интерфейса в реальный интерфейс, который используют обернутые классы.

Паттерн Фасад используется, когда требуется более простой интерфейс (и, опять же, он может быть реализован таким же образом, обернув проблемные классы). Вы бы не сказали, что используете фасад, когда существующий интерфейс несовместим, просто когда вам нужно сделать его более читабельным, менее плохо оформленным и т. д.

18
ответ дан 24 November 2019 в 06:40
поделиться