В чем разница между Фасадом и Адаптером? - PullRequest
77 голосов
/ 03 июня 2010

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

Спасибо

Ответы [ 13 ]

107 голосов
/ 03 июня 2010

Вики-страница Pattern содержит краткую заметку об этом.

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

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

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

РЕДАКТИРОВАТЬ: Быстрая аналогия для шаблона адаптера (на основе комментариев) может быть что-то вроде адаптера DVI-VGA. Современные видеокарты часто DVI, но у вас есть старый монитор VGA. Благодаря адаптеру, который подключается к ожидаемому входу DVI вашей видеокарты и имеет собственный вход VGA, вы сможете заставить свой старый монитор работать с новой видеокартой.

95 голосов
/ 03 июня 2010

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

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

17 голосов
/ 03 июня 2010

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

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

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

8 голосов
/ 05 июня 2016

Фасад:

Ключевые выносы: (от journaldev статья Панкаджа Кумара)

  1. Шаблон фасада больше похож на помощник для клиентских приложений
  2. Шаблон фасада можно применять в любой точке разработки, обычно , когда количество интерфейсов растет и система становится сложной .
  3. Интерфейсы подсистем не знают о Фасаде, и они не должны иметь никаких ссылок на интерфейс Фасада
  4. Для фасадов аналогичного типа следует применять шаблон фасада , его целью является предоставление одного интерфейса, а не нескольких интерфейсов, выполняющих аналогичные задания

Диаграмма классов фасадов:

enter image description here

Adapter:

  1. Это структурный рисунок
  2. Полезно работать с двумя несовместимыми интерфейсами
  3. Это заставляет вещи работать после того, как они спроектированы

Диаграмма классов Адаптера:

enter image description here

Вы можете найти более подробную информацию об адаптере в этом сообщении SE:

Разница между шаблоном моста и шаблоном адаптера

Ключевые отличия:

  1. Фасад определяет новый интерфейс, тогда как Adapter использует старый интерфейс . Адаптер обеспечивает совместную работу двух существующих интерфейсов, в отличие от определения совершенно нового
  2. Адаптер и Фасад оба являются обертками; но это разные виды обёрток. Цель Facade - создать более простой интерфейс, а цель Adapter - разработать существующий интерфейс

Посмотрите статью sourcemaking для лучшего понимания.

8 голосов
/ 03 июня 2010

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

4 голосов
/ 27 января 2018

Фасад обычно контрастирует с адаптером.

+--------------------------------------------------------------+-----------------------------------------------+
|                            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                           |
+--------------------------------------------------------------+-----------------------------------------------+
3 голосов
/ 03 июня 2010

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

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

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

3 голосов
/ 03 июня 2010

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

  • Фасад используется для инкапсуляции всего слоя и предлагает несколько методов для доступа к нему "удобно"
  • Используется адаптер, когда у вас есть два компонента, которые должны уже работать вместе, но не из-за некоторых «незначительных» различий в интерфейсе.
2 голосов
/ 03 июня 2010

Адаптер позволяет двум интерфейсам работать вместе.

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

2 голосов
/ 03 июня 2010

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

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

...