Facade Design Pattern in Java

1. Introduzione

In questo breve tutorial, daremo un'occhiata a uno degli schemi di progettazione strutturale: la facciata .

Per prima cosa, daremo una panoramica del pattern, ne elencheremo i vantaggi e descriveremo quali problemi risolve.

Quindi, applicheremo il modello di facciata a un problema pratico esistente con Java.

2. Cos'è una facciata?

In poche parole, una facciata incapsula un sottosistema complesso dietro una semplice interfaccia. Nasconde gran parte della complessità e rende il sottosistema facile da usare.

Inoltre, se dobbiamo usare direttamente il sottosistema complesso, possiamo ancora farlo; non siamo costretti a usare la facciata tutto il tempo.

Oltre a un'interfaccia molto più semplice, c'è un altro vantaggio nell'usare questo modello di progettazione. Disaccoppia un'implementazione client dal sottosistema complesso. Grazie a ciò, possiamo apportare modifiche al sottosistema esistente e non influire su un client.

Vediamo la facciata in azione.

3. Esempio

Diciamo che vogliamo avviare una macchina. Il diagramma seguente rappresenta il sistema legacy, che ci consente di farlo:

Come puoi vedere, può essere piuttosto complesso e richiede uno sforzo per avviare correttamente il motore :

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

Allo stesso modo, anche l'arresto del motore richiede alcuni passaggi:

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

Una facciata è proprio ciò di cui abbiamo bisogno qui. Nasconderemo tutta la complessità in due metodi: startEngine () e stopEngine () .

Vediamo come possiamo implementarlo:

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

Ora, per avviare e fermare un'auto, abbiamo bisogno solo di 2 righe di codice, invece di 13:

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

4. Inconvenienti

Il motivo della facciata non ci obbliga a compromessi indesiderati, perché aggiunge solo ulteriori strati di astrazione.

A volte il modello può essere abusato in scenari semplici, il che porterà a implementazioni ridondanti.

5. conclusione

In questo articolo, abbiamo spiegato il motivo della facciata e dimostrato come implementarlo sopra un sistema esistente.

L'implementazione di questi esempi può essere trovata su GitHub.