Отношения Facade с другими паттернами
- Фасад задаёт новый интерфейс, тогда как адаптер повторно использует старый. Адаптер оборачивает только один класс, а фасад — целую подсистему. Кроме того, адаптер позволяет двум существующим интерфейсам работать сообща, вместо того чтобы задать полностью новый интерфейс.
- Абстрактная фабрика может быть использована вместо фасада для того, чтобы скрыть платформо-зависимые классы.
- Легковес показывает, как создавать много мелких объектов, а фасад показывает, как создать один объект, который отображает целую подсистему.
-
Посредник и фасад похожи тем, что пытаются организовать работу множества существующих классов.
-
Фасад создаёт упрощённый интерфейс для подсистемы, не внося в неё никакой добавочной функциональности. Сама подсистема не знает о существовании фасада. Классы подсистемы общаются друг с другом напрямую.
-
Посредник централизует общение между компонентами системы. Компоненты системы знают только о существовании посредника, у них нет прямого доступа к другим компонентам.
-
Фасад можно сделать одиночкой, так как обычно нужен только один объект-фасад.
- Фасад похож на заместитель тем, что замещает сложную подсистему и может сам её инициализировать. Но, в отличие от Фасада, заместитель имеет тот же интерфейс, что и его служебный объект, благодаря чему их можно взаимно заменять.
Концептуальный пример
Можно легко недооценить сложность того, что происходит за кулисами, когда ты заказываешь пиццу с помощью кредитной карты. А ведь в этом процессе участвуют десятки подсистем. Вот их малая часть:
- Проверка аккаунта
- Проверка PIN-кода
- Баланс (дебет/кредит)
- Запись в бухгалтерской книге
- Отправка оповещения
В такой сложной системе легко потеряться или что-то сломать, если обращаться с ней неправильно. Для таких случаев и существует паттерн фасад — он позволяет клиенту работать с десятками компонентов, используя при этом простой интерфейс. Клиенту необходимо лишь ввести реквизиты карты, код безопасности, стоимость покупки и тип операции. Фасад управляет дальнейшей коммуникацией между различными компонентами без контакта клиента со сложными внутренними механизмами.
walletFacade.go: фасад
securityCode.go: часть сложной подсистемы
wallet.go: часть сложной подсистемы
ledger.go: часть сложной подсистемы
notification.go: часть сложной подсистемы
main.go: клиентский код
Пришло время поработать с кодом!
output.txt: результат выполнения