Unterschied zwischen den Entwurfsmustern für Fassade, Proxy, Adapter und Dekorateur? [geschlossen]


135

Was ist der Unterschied zwischen den Entwurfsmustern für Fassade, Proxy, Adapter und Dekorateur?

Ich habe nie eine klare Erklärung gelesen, was ist deine?



@ Gavenkoa die andere Frage ist nur über Proxy und Dekorateur
user310291

2
Unglaublich, wie sich einige geschlossene Fragen als so nützlich herausstellen.
Luke

Antworten:


285

Der Adapter passt eine bestimmte Klasse / ein bestimmtes Objekt an eine neue Schnittstelle an. Im ersteren Fall wird typischerweise eine Mehrfachvererbung verwendet. Im letzteren Fall wird das Objekt von einem konformen Adapterobjekt umschlossen und herumgereicht. Das Problem, das wir hier lösen, sind nicht kompatible Schnittstellen .

Fassade ist eher ein einfaches Tor zu einem komplizierten Funktionsumfang. Sie machen eine Blackbox für Ihre Kunden, um sich weniger Sorgen zu machen, dh um die Schnittstellen zu vereinfachen .

Proxy bietet die gleiche Schnittstelle wie die Proxy-for-Klasse und erledigt normalerweise einige Housekeeping-Aufgaben selbstständig. (Anstatt mehrere Kopien eines schweren Objekts zu Xerstellen, erstellen Sie Kopien eines leichtgewichtigen Proxys, Pder XIhre Anrufe nach Bedarf verwaltet und übersetzt.) Sie lösen das Problem, dass der Client ein schweres und / oder komplexes Objekt verwalten muss .

Decorator wird verwendet, um Ihren Objekten mehr Schießpulver hinzuzufügen (beachten Sie den Begriff Objekte - normalerweise dekorieren Sie Objekte zur Laufzeit dynamisch). Sie verbergen / beeinträchtigen die vorhandenen Schnittstellen des Objekts nicht, sondern erweitern es einfach zur Laufzeit .

Nachdem Sie nun den Dekorateur involviert haben, möchten Sie wahrscheinlich wissen, warum die Betonung des Wortobjekts - einige Sprachen (wie Java) erlauben einfach keine virtuelle Vererbung (dh Mehrfachvererbung wie in C ++), damit Sie dies erreichen können Kompilierzeit.

Da wir mehrere Vererbungen (und den gefürchteten Diamanten) hineingezogen haben, werden Sie nach Mixins Ausschau halten - bei denen es sich um eine lineare Verkettung von Schnittstellen handelt , um die Probleme der Mehrfachvererbung zu umgehen. Mixins mischen sich jedoch nicht so gut. Und am Ende haben wir Merkmale - ja, diese zustandslosen kleinen Verhaltensblobs , die in Vorlagenparametern in C ++ ständig angezeigt werden. Merkmale versuchen, die Probleme der Zusammensetzung und Zerlegung von Verhalten auf elegante Weise anzugehen, ohne auf Mehrfachvererbungen oder geordnete Verkettungen zurückzugreifen.


1
HTH! Ich habe versucht, so viel wie möglich einzubringen, ohne zu vage zu sein. Entschuldigen Sie meine Unfähigkeit, es besser zu machen. Ich habe nur Artikel über Eigenschaften (Dissertation) gelesen. Mein Wissen ist daher eher begrenzt und ich bin nicht gut genug, um in alle Muster in diesem Raum zu passen;)
dirkgently

Sie haben eine zukünftige Frage zu Mixins und Merkmalen erwartet, aber ich habe sie noch nicht gesehen!
user310291

1
Ein guter Vergleichslink (via Wikipedia) für die ersten drei (der Dekorateur ist ganz anders): NetObjectives
Liviu

@Liviu Dein Link ist tot. Ich nehme an, Sie haben ursprünglich dorthin gezeigt , aber der Inhalt scheint jetzt hinter einem Login zu stehen.
Jonathan H

@Sheljohn Link aktualisiert: p: Ein guter Vergleichslink (via Wikipedia) für die ersten drei (der Dekorateur ist ganz anders) NetObjectives (Text abrufen, siehe "zwischen"): "Eine der häufigsten Fragen, die ich im Unterricht bekomme, ist" Was ist der Unterschied zwischen Adapter, Proxy und Fassade? Sie scheinen mir wirklich gleich zu sein ".)
Liviu

16

Fassade

Sie können beispielsweise eine Fassade verwenden, um das Aufrufen einer API zu vereinfachen. Schauen Sie sich dieses Beispiel einer entfernten Fassade an. Die Idee dabei ist, dass die vollständige Implementierung des Codes auf dem Server vor dem Client verborgen ist. Der Client ruft eine API-Methode auf, die wiederum einen oder mehrere API-Aufrufe auf dem Server ausführen kann.

Adapter

Ein gutes Beispiel dafür finden Sie hier auf Wikipedia. Ein Client-Objekt Sourcemöchte eine Methode für ein anderes Objekt aufrufen Target, aber die Schnittstelle dieses anderen Objekts unterscheidet sich von den Erwartungen des Clients.

Geben Sie das Adapterobjekt ein.

Es kann einen Aufruf vom SourceObjekt entgegennehmen und hinter den Kulissen die TargetMethode aufrufen, die verwendet werden soll.

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

Was Proxy betrifft, habe ich keine Erfahrung mit diesem Entwurfsmuster.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.