Шаблон дизайна фасада в Java

Шаблон дизайна фасада в Java

1. Вступление

В этом кратком руководстве мы рассмотримone of the structural design patterns: the Facade.

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

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

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

Проще говоря, фасад заключает в себе сложную подсистему за простым интерфейсом. It hides much of the complexity and makes the subsystem easy to use.с

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

Помимо гораздо более простого интерфейса, у этого шаблона проектирования есть еще одно преимущество. It decouples a client implementation from the complex subsystem.  Благодаря этому мы можем вносить изменения в существующую подсистему и не затрагивать клиента.

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

3. Exampleс

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

image

 

Как видите,it can be quite complex and does require some effort to start the engine correctly:

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

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

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

Фасад как раз то, что нам нужно здесь. We’ll hide all the complexity in two methods: startEngine() and stopEngine().

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

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();
    }

Теперьto start and stop a car, we need only 2 lines of code, instead of 13:

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

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

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

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

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

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

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