Differenza tra i modelli di design di facciata, proxy, adattatore e decoratore? [chiuso]


135

Qual è la differenza tra i modelli di design di facciata, proxy, adattatore e decoratore?

Non ho mai letto una spiegazione chiara, qual è la tua?



@gavenkoa l'altra domanda riguarda solo proxy e decoratore
user310291

2
Incredibile come alcune domande chiuse si rivelano così utili.
Luca,

Risposte:


286

L'adapter adatta una determinata classe / oggetto a una nuova interfaccia. Nel primo caso, l'ereditarietà multipla è tipicamente impiegata. In quest'ultimo caso, l'oggetto viene avvolto da un oggetto adattatore conforme e passato. Il problema che stiamo risolvendo qui è quello delle interfacce non compatibili .

La facciata è più simile a un semplice gateway per un insieme complicato di funzionalità. Crea una scatola nera di cui i tuoi clienti devono preoccuparsi di meno, ovvero rendere le interfacce più semplici .

Il proxy fornisce la stessa interfaccia della classe proxy e in genere esegue alcune operazioni di pulizia da solo. (Quindi, invece di fare più copie di un oggetto pesante X, fai copie di un proxy leggero Pche a sua volta gestisce Xe traduce le tue chiamate come richiesto.) Stai risolvendo il problema del client dal dover gestire un oggetto pesante e / o complesso .

Decorator viene utilizzato per aggiungere più polvere da sparo ai tuoi oggetti (nota il termine oggetti - in genere decori oggetti dinamicamente in fase di esecuzione). Non nascondere / compromettere le interfacce esistenti dell'oggetto ma semplicemente estenderlo in fase di esecuzione .

Ora che hai un decoratore coinvolto, probabilmente vorrai sapere perché l'enfasi sull'oggetto parola - alcuni linguaggi (come Java) semplicemente non consentono l'ereditarietà virtuale (cioè l'eredità multipla come fa C ++) per permetterti di realizzare questo in tempo di compilazione.

Dato che abbiamo trascinato in più eredità (e il temuto diamante), dovrai cercare i mixin , che sono ordinati concatenamento lineare di interfacce per aggirare i problemi dell'ereditarietà multipla. Tuttavia, i mixin non si mescolano così bene. E finiamo con i tratti - sì, quei piccoli blob di comportamento apolidi che vedi comparire continuamente nei parametri dei template in C ++. I tratti cercano di affrontare i problemi di composizione e decomposizione del comportamento in modo elegante, senza andare per eredità multiple o concatenamento ordinato.


1
HTH! Ho provato a mettere il più possibile senza essere troppo vago. Scusa la mia incapacità di fare di meglio. Ho letto (tesi di dottorato) solo su tratti. La mia conoscenza quindi è piuttosto limitata e non sono abbastanza bravo da adattarmi a tutti i modelli in questo spazio;)
Dirkgently

Hai anticipato una domanda futura su mixin e tratti ma non li ho ancora visti!
user310291

1
Un buon link di confronto (tramite wikipedia) per i primi tre (il Decorator è piuttosto diverso): NetObjectives
Liviu

@Liviu Il tuo link è morto. Suppongo che inizialmente stavi puntando , ma il contenuto ora sembra essere dietro un login.
Jonathan H,

@Sheljohn Link aggiornato: p: un buon link di confronto (via wikipedia) per i primi tre (il decoratore è piuttosto diverso) NetObjectives (testo di recupero, vedi "tra"): "Una delle domande più frequenti che ottengo in classe è" cos'è la differenza tra Adapter, Proxy e Facade? Mi sembrano davvero gli stessi ".)
Liviu,

16

Facciata

È possibile utilizzare una facciata, ad esempio, per semplificare le chiamate a un'API. Dai un'occhiata a questo esempio di facciata remota. L'idea qui è che la piena implementazione del codice sul server sia nascosta al client. Il client chiama 1 metodo API che, a sua volta, può effettuare 1 o più chiamate API sul server.

Adattatore

Un buon esempio di questo può essere trovato qui , su Wikipedia. Un oggetto client Sourcevorrebbe chiamare un metodo su un altro oggetto Target, ma l'interfaccia di quell'altro oggetto differisce da ciò che il client si aspetta.

Immettere l'oggetto adattatore.

Può ricevere una chiamata Sourcedall'oggetto e, dietro le quinte, chiamare il Targetmetodo che dovrebbe essere usato.

Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)

Per quanto riguarda Proxy, non ho alcuna esperienza di questo modello di progettazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.