Skip to content

Применимость и шаги реализации Facade

Facade используется, когда нужно предоставить простой или урезанный интерфейс для сложной подсистемы.

Часто подсистемы усложняются по мере развития программы. Применение большинства паттернов приводит к появлению меньших классов, но в бóльшем количестве. Такую подсистему проще повторно использовать, настраивая её каждый раз под конкретные нужды. Но вместе с тем применять подсистему без настройки становится труднее. Фасад предлагает определённый вид системы по умолчанию, который устраивает большинство клиентов.

Кроме того, этот паттерн используется, когда ты хочешь разложить подсистему на отдельные слои.

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

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

Шаги реализации паттерна

  1. Определи, можно ли создать более простой интерфейс, чем тот, который предоставляет сложная подсистема. Ты на правильном пути, если этот интерфейс избавит клиента от необходимости знать о подробностях подсистемы.
  2. Создай класс фасада, реализующий этот интерфейс. Он должен переадресовывать вызовы клиента нужным объектам подсистемы. Фасад должен будет позаботиться о том, чтобы правильно инициализировать объекты подсистемы.
  3. Ты получишь максимум пользы, если клиент будет работать только с фасадом. В этом случае изменения в подсистеме будут затрагивать только код фасада, а клиентский код останется рабочим.
  4. Если ответственность фасада начинает размываться, подумай о введении дополнительных фасадов.

Преимущества и недостатки фасада

+ Изолирует клиентов от компонентов сложной подсистемы.

+ Упрощает написание клиентского кода.

— Рискует стать божественным объектом, привязанным ко всем классам программы.

— Вводит еще один слой абстракции, увеличивая когнитивное восприятие, при чтении кода в глубину.