Fornire un'interfaccia unificata a un insieme di interfacce in un sottosistema, definendo un'interfaccia di livello superiore per semplificarne l'uso.
Per ridurre la complessità strutturando il sistema in sottosistemi.
Per minimizzare la comunicazione e le dipendenze tra i sottosistemi e i client.
Per fornire ai client un'interfaccia semplificata e unificata a un sottosistema complesso.
Per nascondere i dettagli interni del sottosistema, mantenendo l'accesso a funzionalità di basso livello solo quando necessario.
Quando si desidera una semplice interfaccia per un sottosistema complesso.
Quando si vuole fornire una vista predefinita per la maggior parte dei client, nascondendo i dettagli avanzati.
Quando ci sono molte dipendenze tra client e classi di implementazione, per separare il sottosistema dai client.
Per definire un punto di accesso a ogni livello di un sottosistema stratificato.
Facade (es. Compiler):
Conosce le classi del sottosistema responsabili delle richieste.
Inoltra le richieste ai componenti appropriati.
Classi del sottosistema (es. Scanner, Parser, ProgramNode, ecc.):
Implementano la funzionalità del sottosistema.
Non hanno conoscenza della Facade e non mantengono riferimenti ad essa.
I client comunicano con il sottosistema tramite la Facade, che traduce le richieste nella lingua del sottosistema.
Gli oggetti del sottosistema eseguono il lavoro effettivo richiesto.
I client che usano la Facade non hanno bisogno di accedere direttamente agli oggetti del sottosistema.
Vantaggi:
Protegge i client dai dettagli complessi del sottosistema.
Riduce il numero di oggetti con cui i client devono interagire.
Promuove un debole accoppiamento tra sottosistemi e client, migliorandone indipendenza e portabilità.
Aiuta a stratificare un sistema e riduce dipendenze complesse o circolari.
Semplifica il porting del sistema su altre piattaforme.
Svantaggi:
Non impedisce ai client di accedere direttamente alle classi del sottosistema, potenzialmente compromettendo la semplicità e la coerenza.
Ridurre l'accoppiamento client-sottosistema:
Usare una classe astratta come Facade per mascherare le implementazioni concrete.
Configurazione flessibile:
Configurare la Facade con diversi oggetti del sottosistema per personalizzare il comportamento.
Interfaccia pubblica e privata del sottosistema:
L'interfaccia pubblica include la Facade e le classi accessibili ai client.
L'interfaccia privata è riservata agli estensori del sottosistema.
In molte applicazioni
Risposta:
Abstract Factory: Per creare oggetti correlati nel sottosistema.
Mediator: Per gestire interazioni complesse tra oggetti.
Singleton: Spesso usato per garantire una singola istanza della Facade.