«1. Введение

В этом кратком руководстве мы рассмотрим один из структурных шаблонов проектирования: Фасад.

Сначала мы дадим обзор шаблона, перечислим его преимущества и опишем, какие проблемы он решает.

Затем мы применим шаблон фасада к существующей практической проблеме с Java.

2. Что такое фасад?

Проще говоря, фасад инкапсулирует сложную подсистему за простым интерфейсом. Он скрывает большую часть сложности и упрощает использование подсистемы.

Кроме того, если нам нужно напрямую использовать сложную подсистему, мы все еще можем это сделать; мы не вынуждены использовать фасад все время.

Помимо гораздо более простого интерфейса, есть еще одно преимущество использования этого шаблона проектирования. Он отделяет реализацию клиента от сложной подсистемы. Благодаря этому мы можем вносить изменения в существующую подсистему и не затрагивать клиента.

Давайте посмотрим на фасад в действии.

3. Пример

Допустим, мы хотим завести машину. Следующая диаграмма представляет унаследованную систему, которая позволяет нам это сделать:

Как видите, она может быть довольно сложной и требует некоторых усилий для правильного запуска двигателя:

Аналогично, остановка двигателя также требует довольно много шагов:

airFlowController.takeAir()
fuelInjector.on()
fuelInjector.inject()
starter.start()
coolingController.setTemperatureUpperLimit(DEFAULT_COOLING_TEMP)
coolingController.run()
catalyticConverter.on()

Фасад — это как раз то, что нам нужно здесь. Всю сложность мы спрячем в двух методах: startEngine() и stopEngine().

fuelInjector.off()
catalyticConverter.off()
coolingController.cool(MAX_ALLOWED_TEMP)
coolingController.stop()
airFlowController.off()

Давайте посмотрим, как мы можем это реализовать:

Теперь, чтобы завести и остановить автомобиль, нам нужно всего 2 строки кода вместо 13:

public class CarEngineFacade {
    private static int DEFAULT_COOLING_TEMP = 90;
    private static int MAX_ALLOWED_TEMP = 50;
    private FuelInjector fuelInjector = new FuelInjector();
    private AirFlowController airFlowController = new AirFlowController();
    private Starter starter = new Starter();
    private CoolingController coolingController = new CoolingController();
    private CatalyticConverter catalyticConverter = new CatalyticConverter();

    public void startEngine() {
        fuelInjector.on();
        airFlowController.takeAir();
        fuelInjector.on();
        fuelInjector.inject();
        starter.start();
        coolingController.setTemperatureUpperLimit(DEFAULT_COOLING_TEMP);
        coolingController.run();
        catalyticConverter.on();
    }

    public void stopEngine() {
        fuelInjector.off();
        catalyticConverter.off();
        coolingController.cool(MAX_ALLOWED_TEMP);
        coolingController.stop();
        airFlowController.off();
    }

4. Недостатки

facade.startEngine();
// ...
facade.stopEngine();

Шаблон фасада не заставляет нас идти на нежелательные компромиссы, потому что он только добавляет дополнительные уровни абстракции.

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

5. Заключение

В этой статье мы объяснили шаблон фасада и продемонстрировали, как реализовать его поверх существующей системы.

Реализацию этих примеров можно найти на GitHub.

«