Padrão de design de fachada em Java
1. Introdução
Neste tutorial rápido, vamos dar uma olhada emone of the structural design patterns: the Facade.
Primeiro, daremos uma visão geral do padrão, listaremos seus benefícios e descreveremos os problemas que ele resolve.
Em seguida, aplicaremos o padrão de fachada a um problema prático existente com Java.
2. O que é uma fachada?
Simplificando, uma fachada encapsula um subsistema complexo atrás de uma interface simples. It hides much of the complexity and makes the subsystem easy to use.
Além disso, se precisarmos usar o subsistema complexo diretamente, ainda podemos fazer isso; não somos forçados a usar a fachada o tempo todo.
Além de uma interface muito mais simples, há mais um benefício de usar este padrão de design. It decouples a client implementation from the complex subsystem. Graças a isso, podemos fazer alterações no subsistema existente e não afetar um cliente.
Vamos ver a fachada em ação.
3. Example
Digamos que queremos ligar um carro. O diagrama a seguir representa o sistema legado, o que nos permite fazer isso:
Como você pode ver,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()
Da mesma forma, parar o mecanismo também requer algumas etapas:
fuelInjector.off()
catalyticConverter.off()
coolingController.cool(MAX_ALLOWED_TEMP)
coolingController.stop()
airFlowController.off()
Uma fachada é exatamente o que precisamos aqui. We’ll hide all the complexity in two methods: startEngine() and stopEngine().
Vamos ver como podemos implementá-lo:
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();
}
Agora,to start and stop a car, we need only 2 lines of code, instead of 13:
facade.startEngine();
// ...
facade.stopEngine();
4. Desvantagens
O padrão de fachada não nos obriga a compensações indesejadas, porque apenas adiciona camadas adicionais de abstração.
Às vezes, o padrão pode ser superutilizado em cenários simples, o que levará a implementações redundantes.
5. Conclusão
Neste artigo, explicamos o padrão da fachada e demonstramos como implementá-lo no topo de um sistema existente.
A implementação desses exemplos pode ser encontradaover on GitHub.