Intento

  • Fornire un’interfaccia unificata ad un insieme di interfacce in un sottosistema.Facade definisce un’interfaccia di livello superiore che rende il sottosistema più facile da usare.
  • Avvolgere un sottosistema complesso con un’interfaccia più semplice.

Problema

Un segmento della comunità di clienti ha bisogno di un’interfaccia semplificata per la funzionalità complessiva di un sottosistema complesso.

Discussione

Facade discute l’incapsulamento di un sottosistema complesso in un singolo oggetto interfaccia. Questo riduce la curva di apprendimento necessaria per sfruttare con successo il sottosistema. Promuove anche il disaccoppiamento del sottosistema dai suoi potenzialmente molti clienti. D’altra parte, se la facciata è l’unico punto di accesso per il sottosistema, limiterà le caratteristiche e la flessibilità di cui i “power user” potrebbero aver bisogno.

L’oggetto facciata dovrebbe essere un sostenitore o facilitatore abbastanza semplice. Non dovrebbe diventare un oracolo onnisciente o un oggetto “dio”.

Struttura

Facade prende un “enigma avvolto in un mistero”, e inserisce un involucro che doma la massa amorfa e imperscrutabile del software.

SubsystemOne e SubsystemThree non interagiscono con i componenti interni di SubsystemTwo.Usano la SubsystemTwoWrapper “facciata” (cioè l’astrazione di livello superiore).

Esempio

La facciata definisce un’interfaccia unificata di livello superiore ad un sottosistema che lo rende più facile da usare. I consumatori incontrano una Facade quando ordinano da un catalogo. Il consumatore chiama un numero e parla con un rappresentante del servizio clienti. Il rappresentante del servizio clienti agisce come una Facade, fornendo un’interfaccia al dipartimento di evasione dell’ordine, al dipartimento di fatturazione e al dipartimento di spedizione.

Lista di controllo

  1. Identificare un’interfaccia più semplice e unificata per il sottosistema o componente.
  2. Progetta una classe ‘wrapper’ che incapsuli il sottosistema.
  3. La facciata/wrapper cattura la complessità e le collaborazioni del componente, e delega ai metodi appropriati.
  4. Il cliente usa (è accoppiato a) solo la facciata.
  5. Considera se ulteriori Facade aggiungerebbero valore.

Regole empiriche

  • Facade definisce una nuova interfaccia, mentre Adapter usa una vecchia interfaccia.Ricorda che Adapter fa lavorare insieme due interfacce esistenti invece di definirne una completamente nuova.
  • Se Flyweight mostra come fare tanti piccoli oggetti, Facadeshows come fare in modo che un singolo oggetto rappresenti un intero sottosistema.
  • Mediator è simile a Facade in quanto astrae la funzionalità di classi esistenti. Mediator astrae/centralizza le comunicazioni arbitrarie tra oggetti colleghi. Aggiunge abitualmente “valore”, ed è conosciuto/referenziato dagli oggetti colleghi. Al contrario, Facade definisce un’interfaccia più semplice per un sottosistema, non aggiunge nuove funzionalità e non è conosciuta dalle classi del sottosistema.
  • Abstract Factory può essere usata come alternativa a Facade per nascondere classi specifiche della piattaforma.
  • Gli oggetti Facade sono spesso Singleton perché solo un oggetto Facade è richiesto.
  • Adapter e Facade sono entrambi wrapper; ma sono diversi tipi di wrapper. L’intento di Facade è quello di produrre un’interfaccia più semplice, mentre l’intento di Adapter è quello di progettare un’interfaccia esistente.Mentre Facade avvolge abitualmente più oggetti e Adapter avvolge un singolo oggetto; Facade potrebbe fare da front-end a un singolo oggetto complesso e Adapter potrebbe avvolgere diversi oggetti legacy.

Domanda: Quindi la differenza tra il patternAdapter e il pattern Facade è che l’Adapter avvolge una classe e la Facade può rappresentare molte classi?

Risposta: No! Ricorda, il pattern Adapter cambia l’interfaccia di una o più classi in un’interfaccia che il cliente si aspetta. Mentre la maggior parte degli esempi del libro di testo mostra l’adattatore che adatta una classe, potrebbe essere necessario adattare molte classi per fornire l’interfaccia a cui è codificato un client. Allo stesso modo, una Facade può fornire un’interfaccia semplificata ad una singola classe con un’interfaccia molto complessa. La differenza tra i due non è in termini di quante classi “avvolgono”, ma nel loro intento.

Supporta il nostro sito web gratuito e possiedi l’eBook!

  • 22 design pattern e 8 principi spiegati in profondità
  • 406 pagine ben strutturate, facili da leggere, senza gergo
  • 228 illustrazioni e diagrammi chiari e utili
  • Un archivio con esempi di codice in 4 lingue
  • Tutti i dispositivi supportati: Formati EPUB/MOBI/PDF

Per saperne di più…

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.