1. Введение
В этом кратком руководстве мы рассмотрим один из шаблонов структурного проектирования: Фасад .
Сначала мы дадим обзор шаблона, перечислим его преимущества и опишем, какие проблемы он решает.
Затем мы применим шаблон фасада к существующей практической проблеме с Java.
2. Что такое фасад?
Проще говоря, фасад инкапсулирует сложную подсистему за простым интерфейсом. Он скрывает большую часть сложности и упрощает использование подсистемы.
Кроме того, если нам нужно напрямую использовать сложную подсистему, мы все еще можем это сделать; мы не вынуждены использовать фасад все время.
Помимо гораздо более простого интерфейса, есть еще одно преимущество использования этого шаблона проектирования. Он отделяет реализацию клиента от сложной подсистемы. Благодаря этому мы можем вносить изменения в существующую подсистему и не затрагивать клиента.
Давайте посмотрим на фасад в действии.
3. Пример
Допустим, мы хотим завести машину. Следующая диаграмма представляет устаревшую систему, которая позволяет нам это сделать:
Как видите, это может быть довольно сложно и требует некоторых усилий для правильного запуска двигателя :
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()
Фасад – это то, что нам здесь нужно. Всю сложность мы спрячем в двух методах: startEngine()
и 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();
}
Теперь, чтобы завести и остановить машину, нам нужно всего 2 строчки кода, вместо 13:
facade.startEngine();
// ...
facade.stopEngine();
4. Недостатки
Шаблон фасада не заставляет нас идти на нежелательные компромиссы, потому что он только добавляет дополнительные уровни абстракции.
Иногда шаблон может использоваться слишком часто в простых сценариях, что приводит к избыточным реализациям.
5. Вывод
В этой статье мы объяснили шаблон фасада и продемонстрировали, как реализовать его поверх существующей системы.
Реализацию этих примеров можно найти на GitHub .