DESIGN PATTERN: FACADE

Il Facade è un pattern strutturale che fornisce un’interfaccia unificata e semplificata a un insieme di sottosistemi complessi.

La “facciata” nasconde i dettagli interni e offre al client un solo punto di accesso, riducendo l’accoppiamento tra componenti e migliorando la leggibilità.

QUANDO USARLO

  • Quando il sistema ha API verbose, complesse o frammentate.
  • Quando vuoi esporre solo facciate e non classi interne ai livelli superiori.

VANTAGGI

  • Semplifica l’uso del sistema, nascondendo la complessità.
  • Riduce l’accoppiamento tra client e sottosistemi.
  • Fornisce un punto unico di controllo (utile per logging, sicurezza, transazioni).
  • Facilita modifiche e manutenzione, isolando le dipendenze.

POTENZIALI SVANTAGGI

  • Se il client necessita di funzionalità molto specifiche, potrebbe comunque dover accedere ai sottosistemi.
  • Un eccessivo numero di facciate può portare a duplicazione di logica già presente nei moduli interni.

CODICE

/**
 * Interfaccia comune
 */
interface Crypto {
	currency: string;
	doPayment(amount: number): void;
	getCurrency(): string;
}

/**
 * Implementazioni concrete
 */
class BTC implements Crypto {
	currency: string = "BTC";

	doPayment(amount: number): void {
		console.log("[BTC] Avvio pagamento di " + amount + " BTC");
		console.log("[BTC] Operazione riuscita");
		console.log("[BTC] Invio mail di conferma");
	}

	getCurrency(): string {
		return this.currency;
	}
}

class Dogecoin implements Crypto {
	currency: string = "Dogecoin";

	doPayment(amount: number): void {
		console.log("[Dogecoin] Avvio pagamento di " + amount + " Dogecoin");
		console.log("[Dogecoin] Operazione riuscita");
		console.log("[Dogecoin] Invio mail di conferma");
	}

	getCurrency(): string {
		return this.currency;
	}
}

/**
 * FACADE
 * Espone un'interfaccia semplificata per il client
 */
class CryptoFacade {
	private wallet: Map<string, Crypto> = new Map();

	constructor() {
		// Registrazione delle crypto disponibili
		const btc = new BTC();
		const dogecoin = new Dogecoin();
		this.wallet.set(btc.getCurrency(), btc);
		this.wallet.set(dogecoin.getCurrency(), dogecoin);
	}

	// Metodo comune per pagare
	public pay(amount: number, currency: string): void {
		const crypto = this.wallet.get(currency);
		if (!crypto) {
			console.log("Valuta non supportata: " + currency);
			return;
		}
		console.log("=== Avvio pagamento tramite Facade ===");
		crypto.doPayment(amount);
		console.log("=== Fine pagamento ===");
	}
}

/**
 * USO DEL FACADE
 * Il client vede solo la Facade, non le classi concrete
 */
const paymentSystem = new CryptoFacade();
paymentSystem.pay(500, "BTC");
paymentSystem.pay(2000, "Dogecoin");
paymentSystem.pay(100, "Ethereum"); // non supportata