Паттерн Фасад (Facade) на реальном примере

Лучший способ понять паттерн Фасад — посмотреть на схему компонентов системы до и после использования фасада. На рисунке показан интерфейс веб-сайта, взаимодействующий с приложением на веб-сервере. В правой части диаграммы код внешнего интерфейса обращается к различным объектам в приложении. Слева, показывая фасад, передняя часть взаимодействует только с фасадным объектом, который, в свою очередь, делегирует ответственность перед внутренними объектами.

Front end веб-сайта взаимодействует с приложением на веб-сервере

Данный паттерн часто встречается в клиентских приложениях, которые используют классы-фасады для упрощения работы со сложными библиотеки или 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();

Добавить комментарий