Skip to content

Отношения Facade с другими паттернами

  • Фасад задаёт новый интерфейс, тогда как адаптер повторно использует старый. Адаптер оборачивает только один класс, а фасад — целую подсистему. Кроме того, адаптер позволяет двум существующим интерфейсам работать сообща, вместо того чтобы задать полностью новый интерфейс.
  • Абстрактная фабрика может быть использована вместо фасада для того, чтобы скрыть платформо-зависимые классы.
  • Легковес показывает, как создавать много мелких объектов, а фасад показывает, как создать один объект, который отображает целую подсистему.
  • Посредник и фасад похожи тем, что пытаются организовать работу множества существующих классов.

  • Фасад создаёт упрощённый интерфейс для подсистемы, не внося в неё никакой добавочной функциональности. Сама подсистема не знает о существовании фасада. Классы подсистемы общаются друг с другом напрямую.

  • Посредник централизует общение между компонентами системы. Компоненты системы знают только о существовании посредника, у них нет прямого доступа к другим компонентам.

  • Фасад можно сделать одиночкой, так как обычно нужен только один объект-фасад.

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

Концептуальный пример

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

  • Проверка аккаунта
  • Проверка PIN-кода
  • Баланс (дебет/кредит)
  • Запись в бухгалтерской книге
  • Отправка оповещения

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

walletFacade.go: фасад

securityCode.go: часть сложной подсистемы

wallet.go: часть сложной подсистемы

ledger.go: часть сложной подсистемы

notification.go: часть сложной подсистемы

main.go: клиентский код

Пришло время поработать с кодом!

output.txt: результат выполнения