Il Facade Pattern è un design pattern di tipo Strutturale che nasconde la complessità di un sistema e offre una interfacca ai client che vogliono accedere ad esso.

In italiano si traduce con “Facciata” perchè è proprio questo il suo obiettivo: semplificare l’ accesso ad un sistema complesso mostrando una facciata. E’ comunemente utilizzato nella programmazione orientata agli oggetti, e spesso nelle librerie di Java.

L’ utilizzo del Facade Pattern nelle librerie ci permette di renderle più leggibili, testabili e facilmente usabili.

Esempio IRL (In Real Life)

Un esempio nella vita reale: dovete costruire una casa, e decidete di prendere 10 operai. Ad un certo punto avete bisogno di un idraulico, un elettricista e un architetto, quindi assoldate anche questi.

Questo devi farlo te, e chiunque come te voglia costruirsi una casa da solo. In questo modo devi: gestire gli operai (con i turni di lavoro, le operazioni da eseguire ecc), aggiungere o rimuovere le persone necessarie e così via.

Se ti fossi però rivolto alla compagnia FacadeCostructionInc avresti potuto risparmiare un bel po’ di fatica: questo perchè avresti dovuto solamente parlare col responsabile che poi avrebbe pensato a gestire tutti i lavori per te.

In pratica

Vediamo un esempio pratico:

Esempio di Facade Pattern
Esempio di Facade Pattern (preso da questo repo)

Questo è il codice di DwarvenGoldmineFacade:

import java.util.ArrayList;
import java.util.List;

public class DwarvenGoldmineFacade {

	List workers;

	public DwarvenGoldmineFacade() {
		workers = new ArrayList<>();
		workers.add(new DwarvenGoldDigger());
		workers.add(new DwarvenCartOperator());
		workers.add(new DwarvenTunnelDigger());
	}

	public void startNewDay() {
		for (DwarvenMineWorker worker : workers) {
			worker.wakeUp();
			worker.goToMine();
		}
	}

	public void digOutGold() {
		for (DwarvenMineWorker worker : workers) {
			worker.work();
		}
	}

	public void endDay() {
		for (DwarvenMineWorker worker : workers) {
			worker.goHome();
			worker.goToSleep();
		}
	}

}

Mentre questo è il codice del client che vuole usare la classe di Facciata:

public class App {

	public static void main(String[] args) {
		DwarvenGoldmineFacade facade = new DwarvenGoldmineFacade();
		facade.startNewDay();
		facade.digOutGold();
		facade.endDay();
	}
}

In teoria

Se avessimo evitato di utilizzare il Facade Pattern cosa avremmo dovuto fare? Avremmo appunto dovuto gestire tutte le azioni dei vari oggetti direttamente dal client. Questo per ogni client che avesse voluto minare.

Inoltre andando a modificare le classi dietro alla Facciata, anche tutti i client dovrebbero essere aggiornati, mentre usando il Facade Pattern possiamo mantenere un ‘interfaccia standard e mantenere all’ oscuro dai dettagli il client.

Esempio di Facade Pattern in UML da Wikipedia
Esempio di Facade Pattern in UML da Wikipedia