Facade

Назначение

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

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

Описание

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

Реализация

Client
Клиент, нуждающийся в функционале, который предоставляется подсистемой.
Facade
Класс, предоставляющий интерфейс доступа к подсистеме

Чем отличается

Adapter приспосабливает один объект для использования через интерфейс, который он не реализует. В случае с фасадом, одного объекта нет, есть сложная подсистема из взаимодействующих объектов и задача стоит в том, чтобы упростить работу с этой подсистемой, а не использовать её как объект некоторого интерфейса. В Facade включено больше логики, чем в Adapter, ему надо упростить существующую сложную систему, а adapter лишь делает некоторые небольшие преобразования, такие как, приведение одного типа аргумента у другому, или замена их местами, вызов метода и другим именем. Adapter тоже может быть использован с несколькими объектами, когда необходимо представить подсистему как один объект с заданным интерфейсом. Но адаптер никогда не определяет целевой интерфейс, он адаптирует объект(ы) к нему. А фасад – наоборот, через абстракцию вводит новый, более удобный для клиента интерфейс.

Варианты

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

Ссылки

https://java-design-patterns.com/patterns/facade/

https://github.com/iluwatar/java-design-patterns/tree/master/facade

https://refactoring.guru/design-patterns/facade

YouTube: Facade Pattern – Design Patterns (ep 9)

Structural Patterns (comparison) – Design Patterns (ep 12)

Baeldung - Facade Design Pattern in Java