13 ответов:
The Фасад Шаблон на странице wiki есть краткая заметка об этом.
"адаптер используется, когда фантик должен уважать определенный интерфейс и должен поддерживать полиморфный поведение. С другой стороны, фасад используется, когда один хочет проще или простой интерфейс для работы."
Я слышал аналогию, что вы должны думать о своем универсальном пульте дистанционного управления, который вы настроили для работы со всеми своими различными стерео системы-вы нажимаете "on", и он включает кабельную коробку, приемник и телевизор. Может быть, это действительно причудливый домашний кинотеатр, и он приглушает свет и тянет тени тоже. Это фасад-одна кнопка / функция, которая заботится о более сложном наборе шагов.
шаблон адаптера просто связывает два несовместимых интерфейса.
EDIT: быстрая аналогия для шаблона адаптера (на основе комментариев) может быть чем-то вроде адаптера DVI-VGA. Современные видеокарты часто являются DVI, но у вас есть старый монитор VGA. С адаптером, который подключается к ожидаемому входу DVI вашей видеокарты и имеет свой собственный вход VGA, вы сможете заставить свой старый монитор работать с вашей новой видеокартой.
адаптер = = делает квадратный колышек вписывается в круглое отверстие.
фасад = = одна панель управления для запуска всех внутренних компонентов.
честно говоря, многие модели могут быть реализованы таким же образом, программно-разница в намерениях.
шаблон проектирования адаптера предназначен для "перевода" интерфейса одного или нескольких классов в интерфейс, который клиент ожидает использовать-адаптер будет переводить вызовы ожидаемого интерфейса в фактический интерфейс, используемый обернутыми классами.
шаблон фасада используется, когда требуется более простой интерфейс (и опять же, может быть реализовано таким же образом путем обертывания оскорбляющих классов.) Вы бы не сказали, что используете фасад, когда существующий интерфейс несовместим, просто когда вам нужно сделать его более читаемым, менее плохо спроектированным и т. д.
фасад предназначен для организации нескольких служб за одним шлюзом службы. Адаптер предназначен для обеспечения способа использования известного интерфейса для доступа к неизвестному.
фасад:
ключевые моменты : ( с journaldev статья Панкаджа Кумара)
- фасадный узор больше похож на помощник для клиентских приложений
- рисунок фасада может быть применен в любой точке развития, как правило когда количество интерфейсов растет и система становится сложной.
- интерфейсы подсистем не знают фасада и они не должно быть никаких ссылка на интерфейс фасада
- шаблон фасада должен применяться для подобных интерфейсов, его цель состоит в том, чтобы обеспечить один интерфейс, а не несколько интерфейсов, которые делают аналогичные виды работ
диаграмма классов фасада:
адаптер:
- это структурным узором
- это полезно работа с двумя несовместимые интерфейсы
- это заставляет работать после того как они конструированы
диаграмма классов адаптера:
вы можете найти более подробную информацию об адаптере в этом сообщении SE:
разница между узором моста и узором адаптера
ключ различия:
- фасад определяет новый интерфейс, в то время как адаптер использует старый интерфейс. Адаптер заставляет два существующих интерфейса работать вместе, а не определять совершенно новый
- адаптер и фасад-это обертки; но это разные виды обертки. целью фасада является создание более простого интерфейса, а целью адаптера является проектирование существующего интерфейс
посмотреть sourcemaking статья тоже для лучшего понимания.
Как обычно, существует сходство между нескольких моделей. Но я бы посмотрел на это так:
- фасад используется для инкапсуляции всего слоя и предлагает некоторые методы для доступа к нему "удобно"
- адаптер используется, где у вас есть два компонента, которые уже должны работать вместе, но не только из-за некоторых "мелких" различий в интерфейсе.
я постараюсь объяснить это простыми словами, без лишней официальности.
представьте, что у вас есть некоторые доменные классы и из пользовательского интерфейса вы хотите взаимодействовать с ними. Фасад может использоваться для предоставления функций, которые могут быть вызваны из слоя пользовательского интерфейса, чтобы слой пользовательского интерфейса не знал ни о каких классах домена, кроме фасада. Это означает, что вместо вызова функций в классах домена вы вызываете одну функцию из фасада, которая будет отвечать за вызов необходимого функции из других классов.
адаптер, с другой стороны, может использоваться для интеграции других внешних компонентов, которые могут иметь ту же функциональность, что и вам, но их функции не называются точно так же. Скажи, что у тебя есть
Carкласс в вашем домене, и вы работаете с внешним поставщиком автомобилей, который также имеет класс автомобиля. В этом классе у вас есть функцияcar.getDoors()но внешний провайдер имеет эквивалентcar.getNumDoors(). Вы же не хотите изменить как вы вызываете эту функцию, поэтому вы можете использовать класс адаптера для обертывания внешнего класса Car, чтобы вызватьgetDoors()адаптера делегируется вgetNumDoors()внешнего класса.
шаблон адаптера позволяет двум ранее несовместимым интерфейсам работать друг с другом. Имеет 2 отдельных интерфейса в игре.
шаблон фасада принимает известный интерфейс, который является низкоуровневым / мелкозернистым, и обертывает его с более высоким уровнем/курсовым зернистым интерфейсом. Имеет один интерфейс, который был упрощен путем обертывания с другим.
адаптер обеспечивает два интерфейса работать вместе.
фасад предоставляет один класс на более высокий и более ограниченный уровень. Например, фасад модели вида может предоставлять только определенные свойства только для чтения класса более низкого уровня.
фасад обычно противопоставляется переходнику.
+--------------------------------------------------------------+-----------------------------------------------+ | 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 | +--------------------------------------------------------------+-----------------------------------------------+
Я читал оба определения, и они кажутся совершенно одинаковыми.
в самом деле ?
Я заметил, что термин адаптер иногда используется для описания того, что на самом деле Stategy, может быть, потому что это слово более выразительным.
например, Zend Framework, все адаптер классы на самом деле реализации стратегия шаблон, потому что они только оберните собственный код за классами, чтобы иметь несколько поведений.
адаптеры часто используются для переноса устаревшего или" старого " кода.
фасад
абстрагирует сложность, чтобы обеспечить более простой интерфейс. Скажем, например, компьютерная ОС абстрагирует сложность базового оборудования. Или языки программирования высокого уровня(Python/JavaScript) абстрагируют сложность по сравнению с языком низкого уровня (C).
адаптер
это аналоги аппаратных адаптеров. Скажем, вы хотите подключить
USB deviceдоserial portвам понадобитсяUSB-serial port adapter.


Comments