Что такое паттерн "Фасад" (Facade)

Фасад — структурный паттерн проектирования, который предоставляет простой интерфейс к сложной системе классов, библиотеке или подсистеме. Фасад упрощает взаимодействие с системой, скрывая её сложность и делая код клиента более понятным и удобным.

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

Преимущества паттерна «Фасад»

  • Упрощает использование сложных систем.
  • Снижает зависимость клиента от внутренней реализации подсистемы.
  • Повышает удобочитаемость и поддержку кода.

Пример:

  • Сложная подсистема: несколько классов с разным функционалом.
  • Фасад: класс с простым интерфейсом, который объединяет вызовы.

Где применяется паттерн «Фасад»?

  • В крупных системах с множеством взаимосвязанных компонентов.
  • При проектировании библиотек и API.
  • В сложных интерфейсах для упрощения работы с подсистемами.

Пример реализации на JavaScript

// Сложная подсистема class CPU { freeze() { console.log("CPU заморожен"); } jump(position) { console.log(`CPU прыгает к адресу ${position}`); } execute() { console.log("CPU выполняет инструкции"); } } class Memory { load(position, data) { console.log(`Память загружает данные по адресу ${position}`); } } class HardDrive { read(lba, size) { console.log(`Жёсткий диск читает ${size} байт с LBA ${lba}`); return "данные"; } } // Фасад class ComputerFacade { constructor() { this.cpu = new CPU(); this.memory = new Memory(); this.hardDrive = new HardDrive(); } start() { this.cpu.freeze(); const data = this.hardDrive.read(0, 1024); this.memory.load(0, data); this.cpu.jump(0); this.cpu.execute(); } } // Использование const computer = new ComputerFacade(); computer.start();

Когда стоит использовать паттерн «Фасад»?

  • Нужно скрыть сложность подсистемы.
  • Требуется упростить взаимодействие с комплексной системой.
  • Желаете снизить связанность между клиентом и подсистемой.

Отличие от других паттернов

  • В отличие от адаптера, фасад создаётся для упрощения использования, а не для согласования несовместимых интерфейсов. Фасад упрощает интерфейс подсистемы, не изменяя её.

Плюсы паттерна

  • Упрощение интерфейса.
  • Снижение зависимости клиента от внутренностей подсистемы.
  • Улучшение читаемости и поддержки кода.

Минусы паттерна

  • Может привести к чрезмерной централизации логики в фасаде.
  • Не всегда решает проблему избыточной сложности подсистемы.