В чем разница между шаблонами проектирования фасадов и ворот? - PullRequest
55 голосов
/ 12 декабря 2010

или Фасад == Шлюз?

Ответы [ 11 ]

77 голосов
/ 21 ноября 2012

Рассматривая «Фасад» в книге GoF и ссылку в другом ответе на «Врата Мартина Фаулера», выясняется, что их фокус направлен в разные стороны.) внешние клиенты;

Шлюз обеспечивает простое единое представление внешних ресурсов для внутренних компонентов приложения.

Это различие позволяет нам сосредоточиться на том, что является более важным в проекте:

С Фасадом внешняя система является нашим клиентом;лучше добавить сложность, обращенную внутрь, если это упрощает внешний интерфейс.

Благодаря шлюзу внутренняя система является нашим клиентом;оказать ему всю возможную помощь, даже если внешность более сложная.

33 голосов
/ 28 ноября 2012

Эти два шаблона очень похожи в том, что оба они служат обертками над чем-то .Разница заключается в контексте : фасад стоит над группой подсистем, а шлюз может стоять над любой функциональностью.С этой точки зрения, для меня Фасад является конкретным корпусом Gateway (не напротив).

Фасад применяется, когда мы думаем, что работа с подсистемами сложна или , если мы хотим сгруппировать несколько вызовов подсистем в одно выполнение [метода].Однако это не обязательно означает, что подсистемы недоступны или что они достаточно сложны.Это просто означает, что у нас есть подсистемы.

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

Если пример все еще необходим для прояснения :

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

class MortgateFacade {
    bool IsCreditWorth(string customerName) {
        return !_checkingAccSystem.HasNegativeBalance(customerName) && !_creditAccSystem.HasNegativeCredit(customerName) && !_backOfficeSystem.IsInBlackList(customerName);
    }
}

Шлюз может запросить таблицу базы данных и вернуть клиента по идентификатору.(Да, это так просто!)

class CustomersGateway {
    Customer GetCustomer(int id) {
        return _db.ExecuteOne("SELECT TOP 1 FROM CUSTOMERS WHERE CUSTOMER_ID="+id).AsCustomer();
    }
}

[Очевидно, это псевдокод]

24 голосов
/ 05 января 2011

Назначение фасада задается http://c2.com/cgi/wiki?FacadePattern как

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

Основное внимание здесь уделяется разработке интерфейса, который скрывает сложность, и я думаю, что ключевая идея состоит в том, чтобы скрыть несколько мелкозернистых взаимодействий в одном более удобном взаимодействии. Следовательно, в центре внимания Facade - клиент.

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

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

Очевидно, что неофициально шлюз - это Фасад, поскольку он скрывает детали, но я думаю, что когда вы реализуете Фасад GOF и Шлюз Фаулера, вы в конечном итоге делаете совершенно разные вещи.

7 голосов
/ 23 января 2013

Вот прямая цитата из книги Фаулера:

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

[Глава 18]

7 голосов
/ 12 декабря 2010

Я думаю, что Gateway - это особый случай Facade - фасад над внешней системой.

6 голосов
/ 20 мая 2011

Это может быть несколько упрощено, но вот мое мнение.

  • При использовании шаблона Фасад вы предоставляете интерфейс, который другие могут использовать для общения с вашим приложением. Пример: Вы реализовали какое-то приложение с несколькими «модулями», чтобы упростить доступ к «модулям», вы создали Фасад, чтобы было проще взаимодействовать с модулями ... единой точкойконтакт.
  • При использовании шаблона Gateway вы инкапсулируете некоторую внешнюю часть, которую хотите использовать. Пример: вы хотите использовать ведение журнала, но не хотите привязываться к конкретной структуре ведения журнала, в этом случае вы можете определить свой шлюз, который определяет функциональность, которую вы хотите использовать, и позволить шлюзу обрабатывать взаимодействие сструктура ведения журнала, которую вы хотите использовать.Это облегчает изменение структуры ведения журналов в будущем.
4 голосов
/ 17 августа 2015

Проще говоря, Facade - это шаблон проектирования, а Gateway - архитектурный шаблон.

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

Когда вы думаете о шаблонах архитектуры, подумайте об узлах.Когда вы думаете о шаблонах проектирования, думайте о классах / объектах.

Узел - это абстракция: устройства - аппаратные средства и системное программное обеспечение - например, ОС, платформа / инфраструктура и т. Д. Системное программное обеспечение «назначено» устройству.Узел «инкапсулирует» программное обеспечение устройства и системы и связан с другими узлами, составляющими архитектуру.

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

2 голосов
/ 16 января 2017

A рисунок фасада главное значение заключается в том, чтобы ' упростить ' использование внутренних компонентов (за фасадом). Может быть так, что одна точка входа или функция на фасаде будет использовать несколько функций внутренних компонентов. Если шлюз имеет то же значение, что и , упрощающее использование API или компонентов, то его можно считать фасадом. В других ситуациях шлюз может быть просто промежуточным программным обеспечением, адаптером, упаковщиком или элементом переадресации вызовов архитектуры. Или на шлюзе может быть несколько шляп, например, упрощение нескольких потоков, переадресация некоторых вызовов и одновременная работа в качестве промежуточного ПО для аутентификации или авторизации. Таким образом, шлюз IMHO является высоко абстрактным шаблоном, который может включать один или несколько конкретных структурных шаблонов, таких как фасад, адаптер, оболочка, декоратор или промежуточное программное обеспечение и т. Д. .

Мартин Фаулер определение шлюза имеет узкий характер (по крайней мере, один здесь ) и ближе к API-шлюзам , действующим как декораторы формата .

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

2 голосов
/ 21 ноября 2014

Чтобы ответить на ваш вопрос, я бы не сказал, что Facade == Gateway, но этот Facade≈Gateway. Под этим я подразумеваю, что они приблизительно равны, как они различаются, по-видимому, не ясно, исходя из различных мнений выше.

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

2 голосов
/ 12 декабря 2010

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

...