Лучший способ понять паттерн Фасад - посмотреть на схему компонентов системы до и после использования фасада. На рисунке показан интерфейс веб-сайта, взаимодействующий с приложением на веб-сервере. В правой части диаграммы код внешнего интерфейса обращается к различным объектам в приложении. Слева, показывая фасад, передняя часть взаимодействует только с фасадным объектом, который, в свою очередь, делегирует ответственность перед внутренними объектами.
Данный паттерн часто встречается в клиентских приложениях, которые используют классы-фасады для упрощения работы со сложными библиотеки или API.
Признаки применения паттерна: Фасад угадывается в классе, который имеет простой интерфейс, но делегирует основную часть работы другим классам. Чаще всего, фасады сами следят за жизненным циклом объектов сложной системы.
class Facade { protected $subsystem1; protected $subsystem2; public function __construct( Subsystem1 $subsystem1 = null, Subsystem2 $subsystem2 = null ) { $this->subsystem1 = $subsystem1 ?: new Subsystem1(); $this->subsystem2 = $subsystem2 ?: new Subsystem2(); } public function operation() { $result = "Facade initializes subsystems:\n </br>"; $result .= $this->subsystem1->operation1(); $result .= $this->subsystem2->operation1(); $result .= "Facade orders subsystems to perform the action:\n </br>"; $result .= $this->subsystem1->operationN(); $result .= $this->subsystem2->operationZ(); return $result; } } class Subsystem1 { public function operation1() { return "Subsystem1: Ready!\n </br>"; } // ... public function operationN() { return "Subsystem1: Go!\n </br>"; } } class Subsystem2 { public function operation1() { return "Subsystem2: Get ready!\n </br>"; } // ... public function operationZ() { return "Subsystem2: Fire!\n </br>"; } } $subsystem1 = new Subsystem1(); $subsystem2 = new Subsystem2(); $facade = new Facade($subsystem1, $subsystem2); echo $facade->operation();