2010-06-02 3 views

ответ

86

На этой вики-странице Facade Pattern есть краткая заметка об этом.

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

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

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

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

+3

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

+2

Отличная аналогия! Пример Java в реальном мире шаблона адаптера может помочь лучше понять его: ['InputStreamReader'] (http://java.sun.com/javase/6/docs/api/java/io/InputStreamReader.html), который адаптирует' InputStream' в 'Reader' и [' OutputStreamWriter'] (http://java.sun.com/javase/6/docs/api/java/io/OutputStreamWriter.html), который адаптирует 'OutputStream' к' Writer' Оба, которые представляют собой разные абстрактные типы. – BalusC

+1

@Khnle - шаблон адаптера в действии: http://upload.wikimedia.org/wikipedia/commons/8/80/USB_PS2_Adapters.JPG –

7

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

2

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

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

2

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

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

3

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

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

Хорошее объяснение. Это первый раз, когда я натолкнулся на слово «несущественные различия» при описании адаптера, который является истинным. – Sudara

78

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

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

+2

Этот ответ окутан до совершенства! Я включаю это в свои заметки о шаблонах. :) –

+0

Величие в простоте –

15

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

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

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

3

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

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

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

0

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

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

Я заметил, что термин адаптер иногда используется, чтобы описать то, что на самом деле СТРАТЕГИЯ, может быть, потому что это слово более выразительным.

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

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

6

Фасад:

Основные тезисы: (от journaldev статьи по Pankaj Kumar)

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

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

enter image description here

адаптер:

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

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

enter image description here

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

Difference between Bridge pattern and Adapter pattern

Основные отличия:

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

взглянуть на sourcemaking статьи тоже для лучшего понимания.

+0

Любовь, чтобы увидеть диаграммы! Однако только некоторые пояснения, когда я изменяю число/тип параметров, означает ли это, что он не является адаптером? как 'someMethod (int year, int month)' был делегирован 'someMethod (DateTime start, DateTime end)' или позволяет 'someMethod()' делегировать 'someMethod (T param)' –

+0

Если оба метода одинаковы класс, это называется перегрузкой. Если они находятся в разных классах, это может быть adpater, если реализованы адаптивные и адаптированные отношения. –

+0

Действительно приятное объяснение. –

0

Фасад обычно противоположен адаптеру.

+--------------------------------------------------------------+-----------------------------------------------+ 
|       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       | 
+--------------------------------------------------------------+-----------------------------------------------+ 
Смежные вопросы