2010-06-02 25 views

risposta

86

La pagina wiki Facade Pattern ha una breve nota a riguardo.

"un adattatore viene utilizzato quando l'involucro deve rispettare una particolare interfaccia e deve sostenere un polimorfico comportamento. D'altra parte, una facciata viene utilizzato quando si vuole un'interfaccia più facile o semplice da lavorare con."

Ho sentito un'analogia che dovresti pensare al tuo telecomando universale che hai impostato per lavorare con tutti i tuoi diversi sistemi stereo - premi "on" e si accende il decoder via cavo, il ricevitore, e la tua TV. Forse è un home theater molto elegante e attenua le luci e disegna anche le ombre. Questa è una facciata - un pulsante/funzione che si occupa di una serie di passaggi più complicata.

Il modello di adattatore collega solo due interfacce incompatibili.

MODIFICA: Un'analogia rapida per il modello di adattatore (basato sui commenti) potrebbe essere qualcosa come un adattatore DVI-VGA. Le moderne schede video sono spesso DVI, ma hai un vecchio monitor VGA. Con un adattatore che si inserisce nell'ingresso DVI previsto della scheda video e dispone di un proprio ingresso VGA, sarà possibile far funzionare il vecchio monitor con la nuova scheda video.

+3

Grande analogia tramite telecomando. La spiegazione del modello dell'adattatore è OK, ma sarebbe bello inventare lo stesso tipo di analogia. –

+2

Eccellente analogia davvero! Un vero esempio di Java del modello Adapter può aiutare a comprenderlo meglio: ['InputStreamReader'] (http://java.sun.com/javase/6/docs/api/java/io/InputStreamReader.html) che si adatta' InputStream' a 'Reader' e [' OutputStreamWriter'] (http://java.sun.com/javase/6/docs/api/java/io/OutputStreamWriter.html) che adatta 'OutputStream' a' Writer' Entrambi i quali sono diversi tipi astratti. – BalusC

+1

@Khnle - Schema dell'adattatore in azione: http://upload.wikimedia.org/wikipedia/commons/8/80/USB_PS2_Adapters.JPG –

7

Una facciata è stato progettato per organizzare più servizi dietro un unico gateway di servizio. Un adattatore è progettato per fornire un modo per utilizzare un'interfaccia conosciuta per accedere a uno sconosciuto.

2

Il modello di adattatore consente a due interfacce, precedentemente incompatibili, di funzionare l'una con l'altra. Ha 2 interfacce separate in gioco.

Il modello di facciata prende un'interfaccia conosciuta, ovvero a basso livello/a grana fine e la avvolge con un'interfaccia di livello superiore/a grana grossa. Ha una singola interfaccia, che è stata semplificata avvolgendola con un'altra.

2

L'adattatore fa funzionare due interfacce.

La facciata espone una singola classe a un livello più alto e più limitato. Ad esempio, una facciata del modello di vista può esporre solo determinate proprietà di sola lettura di una classe di livello inferiore.

3

Come al solito, esistono similitudini tra diversi modelli. Ma vorrei vederlo in questo modo:

  • Una facciata viene utilizzato per incapsulare un intero livello, e di offrire alcuni metodi per accedervi "comodamente"
  • Un adattatore viene utilizzato, in cui si dispone di due componenti che dovrebbero già lavorare insieme, ma non farlo, solo a causa di alcune "non importanti" differenze nell'interfaccia.
+0

Buona spiegazione. Questa è la prima volta che mi imbatto nella parola "differenze insignificanti" quando descrivo l'adattatore, che è infatti vero – Sudara

78

Adattatore == inserire un piolo quadrato in un foro rotondo.

Facciata == un unico pannello di controllo per eseguire tutti i componenti interni.

+2

Questa risposta è resa nota alla perfezione! Lo sto includendo nelle note del mio modello. :) –

+0

grandezza in semplicità –

15

Onestamente, molti modelli potrebbero essere implementati allo stesso modo a livello di codice - la differenza è nell'intento.

Il modello di progettazione dell'adattatore ha lo scopo di "tradurre" l'interfaccia di una o più classi in un'interfaccia che il client si aspetta di utilizzare - l'adattatore tradurrebbe le chiamate nell'interfaccia prevista nell'interfaccia effettiva utilizzata dalle classi avvolte .

Il modello di facciata viene utilizzato quando si desidera un'interfaccia più semplice (e ancora, potrebbe essere implementato nello stesso modo avvolgendo le classi che causano errori). Non si direbbe che si stia utilizzando una facciata quando l'interfaccia esistente non è compatibile, proprio quando è necessario renderlo più leggibile, meno mal progettato, ecc.

3

Cercherò di spiegarlo in parole semplici, senza troppe formalità.

Immagina di avere alcune classi di dominio e dall'interfaccia utente che desideri interagire con loro. Una facciata può essere utilizzata per fornire funzioni che possono essere chiamate dal livello dell'interfaccia utente in modo che il livello dell'interfaccia utente non conosca alcuna classe di dominio diversa dalla facciata. Ciò significa che invece di chiamare le funzioni nelle classi di dominio si chiama una singola funzione dalla facciata, che sarà responsabile di chiamare le funzioni necessarie dalle altre classi.

Un adattatore, d'altra parte, può essere utilizzato per integrare altri componenti esterni che potrebbero avere la stessa funzionalità necessaria ma le loro funzioni non sono chiamate nello stesso modo. Supponi di avere una classe Car nel tuo dominio e di lavorare con un fornitore di autoveicoli esterno che abbia anche una classe Car definita. In questa classe, hai la funzione car.getDoors() ma il provider esterno ha l'equivalente car.getNumDoors(). Non si desidera modificare il modo in cui si chiama questa funzione, quindi è possibile utilizzare una classe adattatore per includere la classe Car esterna in modo che una chiamata a getDoors() della scheda sia delegata a getNumDoors() della classe esterna.

0

Ho letto entrambe le definizioni e sembrano uguali.

Davvero?

ho notato che il termine adattatore viene talvolta usato per descrivere ciò che è in realtà un Stategy, forse perché la parola è più espressivo.

Per esempio, in Zend Framework, tutti i Adapter classi sono in realtà le implementazioni della strategia modello , perché solo avvolgere codice nativo dietro classi, di avere diversi comportamenti.

Gli adattatori vengono spesso utilizzati per avvolgere codice legacy o "vecchio stile".

6

Facciata:

takeaway principali: (da journaldev articolo di Pankaj Kumar)

  1. Facciata modello è più simile a un aiutante per le applicazioni client
  2. Facciata modello possono essere attivate in qualsiasi punto di sviluppo, di solito quando il numero di interfacce cresce e il sistema diventa complesso.
  3. interfacce sottosistema non sono consapevoli di facciata e non dovrebbe avere alcun riferimento dell'interfaccia Facciata
  4. Facciata modello deve essere applicato per simile tipo di interfacce, il suo scopo è di fornire una singola interfaccia anziché interfacce multiple che fa il simile tipo di lavoro

Facciata diagramma delle classi:

enter image description here

Adapter:

  1. Si tratta di un modello strutturale
  2. È utile lavorare con due interfacce incompatibili
  3. Si rende le cose dopo che sono progettati

Schema di classe dell'adattatore:

enter image description here

Potete trovare maggiori dettagli su adattatore in questo post SE:

Difference between Bridge pattern and Adapter pattern

differenze chiave:

  1. Facciata definisce una nuova interfaccia, mentre L'adattatore utilizza una vecchia interfaccia. Adapter fa funzionare due interfacce esistenti anziché definirne uno completamente nuovo
  2. Adapter e Facade sono entrambi wrapper; ma sono diversi tipi di wrapper. L'intento di facciata è di produrre un'interfaccia più semplice, e l'intento di adattatore è quello di progettare ad un'interfaccia esistente

Dai un'occhiata alla sourcemaking articolo troppo per una migliore comprensione.

+0

Amore per vedere gli schemi! Solo qualche chiarimento, però, quando cambio il numero/tipo di parametri significa che non è più un adattatore? come 'someMethod (int anno, int mese)' è stato delegato a 'someMethod (DateTime start, DateTime end)' o lasciamo dire 'someMethod()' delegato a 'someMethod (T param)' –

+0

Se entrambi i metodi sono nello stesso classe, si chiama overloading. Se si trovano in classi diverse, può essere richiesto se la relazione dell'adattatore e dell'adattatore è implementata –

+0

spiegazione veramente buona. –

0

La facciata è in genere in contrasto con l'adattatore.

+--------------------------------------------------------------+-----------------------------------------------+ 
|       Facade       |     Adapter     | 
+--------------------------------------------------------------+-----------------------------------------------+ 
| Simplifies multiple complex components with single interface | Provides differnet interface for an interface | 
| Works with multiple components        | Works with single component     | 
| Control panel is an example         | A power adapter is an example     | 
| High-level interface           | Low-level interface       | 
+--------------------------------------------------------------+-----------------------------------------------+ 
Problemi correlati