Il Pattern Facade



Il Pattern Facade è un design pattern strutturale che fornisce un'interfaccia unificata per un insieme di interfacce in un sottosistema. Questo pattern semplifica l'uso di un sistema complesso nascondendone la complessità dietro un'unica interfaccia di accesso. L'obiettivo principale è migliorare la leggibilità del codice e ridurre le dipendenze tra i componenti.

🔗 Ti piace Techelopment? Dai un’occhiata al sito per tutti i dettagli!


Famiglia di Pattern: Pattern Strutturali

Il Pattern Facade appartiene alla famiglia dei design pattern strutturali. I pattern strutturali si concentrano sull'organizzazione delle classi e degli oggetti per facilitare il design del software, migliorandone la manutenibilità e riducendo le dipendenze tra le componenti.


Diagramma



Come Funziona il Pattern Facade

Per capire meglio il funzionamento del pattern Facade, immaginiamo di avere un sistema audio-video complesso con più componenti, come un lettore Blu-ray, un proiettore e un sistema audio surround. Per accendere il sistema e riprodurre un film, bisogna:

  1. Accendere il proiettore

  2. Impostare la sorgente sul lettore Blu-ray

  3. Accendere il lettore Blu-ray

  4. Accendere il sistema audio

  5. Impostare il volume

Se ogni azione fosse eseguita direttamente dall'utente interagendo con ogni singolo componente, il codice sarebbe difficile da gestire. Con il pattern Facade, possiamo creare una classe HomeTheaterFacade che incapsula queste operazioni e fornisce un metodo semplificato:

class HomeTheaterFacade {
    constructor(projector, bluRayPlayer, soundSystem) {
        this.projector = projector;
        this.bluRayPlayer = bluRayPlayer;
        this.soundSystem = soundSystem;
    }

    watchMovie() {
        this.projector.on();
        this.projector.setInput(this.bluRayPlayer);
        this.bluRayPlayer.on();
        this.soundSystem.on();
        this.soundSystem.setVolume(10);
    }
}

Ora, invece di interagire con ogni singolo componente, possiamo semplicemente chiamare:

homeTheater.watchMovie();


Un esempio più concreto: Pagamenti online

Supponiamo di dover implementare un sistema di pagamenti online. Questo sistema coinvolge diverse operazioni:

  • Verifica della disponibilità di fondi

  • Elaborazione del pagamento

  • Invio della ricevuta

Senza il pattern Facade, il codice dell'applicazione dovrebbe interagire direttamente con ogni servizio, aumentando la complessità e il rischio di errori. Utilizzando il pattern Facade, possiamo creare una classe che nasconde i dettagli di implementazione:.

class PaymentFacade {
    constructor(bankService, paymentProcessor, receiptService) {
        this.bankService = bankService;
        this.paymentProcessor = paymentProcessor;
        this.receiptService = receiptService;
    }

    processPayment(account, amount) {
        if (this.bankService.verifyFunds(account, amount)) {
            this.paymentProcessor.process(account, amount);
            this.receiptService.sendReceipt(account, amount);
        } else {
            console.log("Fondi insufficienti");
        }
    }
}

Ora, per elaborare un pagamento, l'applicazione può semplicemente chiamare:

paymentFacade.processPayment("12345", 100.0);

Questo approccio rende il codice più chiaro, meno soggetto a errori e più semplice da mantenere.

Grazie al Pattern Facade possiamo semplificare l'interazione con sistemi complessi, migliorando la manutenibilità e riducendo le dipendenze dirette tra i componenti. Infatti, viene utilizzato frequentemente nei framework e nelle librerie per fornire API intuitive e facili da usare.


Follow me #techelopment

Official site: www.techelopment.it
facebook: Techelopment
instagram: @techelopment
X: techelopment
Bluesky: @techelopment
telegram: @techelopment_channel
whatsapp: Techelopment
youtube: @techelopment