Назначение
Facade предоставляет простой интерфейс для группы взаимодействующих связанных объектов или сложной подсистемы. Задача 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)