Подтвердить что ты не робот

В чем разница между шаблоном фасада и адаптера?

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

Спасибо

4b9b3361

Ответ 1

В этой вики-странице на странице вики-страницы содержится краткая заметка об этом.

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

Фасад:

Основные выводы: (из journaldev статьи Панкаджа Кумара)

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

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

enter image description here

Адаптер:

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

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

enter image description here

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

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

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

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

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

Ответ 6

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

+--------------------------------------------------------------+-----------------------------------------------+
|                            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                           |
+--------------------------------------------------------------+-----------------------------------------------+

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

Цель

фасад это простота

адаптер совместимости.

Ответ 10

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

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

Ответ 11

Адаптер объединяет два интерфейса.

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

Ответ 12

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

Действительно?

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

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

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

Ответ 13

Фасад

Абстрагирует сложность, чтобы обеспечить более простой интерфейс. Скажем, например, компьютерная ОС абстрагирует сложность базового оборудования. Или языки программирования высокого уровня (Python/JavaScript) абстрагируют сложность по сравнению с языком низкого уровня (C).

адаптер

Это аналоги аппаратных адаптеров. Скажем, вы хотите подключить USB device к serial port, вам понадобится USB-serial port adapter.

Ответ 14

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

Шаблон фасада упрощает сложную подсистему (имеющую несколько компонентов) с одним интерфейсом.