2010-08-15 3 views

Antwort

232

Adapter passt eine gegebene Klasse/Objekt an eine neue Schnittstelle an. Im Fall des ersteren wird typischerweise Mehrfachvererbung verwendet. Im letzteren Fall wird das Objekt von einem entsprechenden Adapterobjekt umschlossen und weitergegeben. Das Problem, das wir hier lösen, ist das von nicht kompatiblen Schnittstellen.

Fassade ist mehr wie ein einfaches Gateway zu einer komplizierten Reihe von Funktionen. Sie machen eine Black-Box, damit sich Ihre Kunden weniger Sorgen machen, d. H. Schnittstellen einfacher machen.

Proxy bietet die gleiche Schnittstelle wie die proxied-for-Klasse und in der Regel einige Hauswirtschaft Zeug für sich. (Anstatt also mehrere Kopien eines schweren Objekts X zu erstellen, erstellen Sie Kopien eines leichtgewichtigen Proxys P, der wiederum X verwaltet und Ihre Anrufe nach Bedarf übersetzt.) Sie lösen das Problem, dass der Client eine schwere und/oder oder komplexes Objekt.

Dekorator wird verwendet, um Ihren Objekten mehr Schießpulver hinzuzufügen (beachten Sie den Begriff Objekte - normalerweise schmücken Sie Objekte dynamisch zur Laufzeit). Sie verdecken nicht die vorhandenen Schnittstellen des Objekts, sondern erweitern es einfach zur Laufzeit.

Nun, da Sie Dekorator beteiligt haben, werden Sie wahrscheinlich wissen wollen, warum die Betonung auf das Wort Objekt - einige Sprachen (wie Java) einfach nicht zulassen, virtuelle Vererbung (dh Mehrfachvererbung wie C++) erlaubt um dies zur Kompilierzeit zu erreichen.

Da wir in mehreren Erbschaften gezogen haben (und die gefürchtete Diamant) Sie Mixins schauen wird - die lineare Verkettung von Schnittstellen bestellt werden um die Probleme der Mehrfachvererbung zu bekommen. Mixins mischen sich jedoch nicht so gut. Und wir enden mit Traits - ja diese statuslose kleine Blobs des Verhaltens, die Sie Pop-up die ganze Zeit in Template-Parameter in C++ sehen. Traits versuchen, die Probleme der Komposition und Dekomposition von Verhalten elegant anzugehen, ohne dabei auf mehrfache Erbschaften oder geordnete Verkettungen zu setzen.

+1

HTH! Ich habe versucht, so viel wie möglich hineinzulegen, ohne zu vage zu sein. Entschuldige meine Unfähigkeit, es besser zu machen. Ich habe (Dissertation) Papiere über Eigenschaften allein gelesen. Mein Wissen ist daher ziemlich begrenzt und ich bin nicht gut genug, um in alle Muster in diesem Raum zu passen;) – dirkgently

+0

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

+1

Ein guter Vergleich Link (über Wikipedia) für die ersten drei (der Dekorator ist ganz anders): [NetObjectives] (http://www.netobjektivtest.com/PatternRepository/index.php?title=AdapterVersusProxyVersusFacadePatternComparison) – Liviu

15

Fassade

Sie eine Fassade zum Beispiel nutzen könnte, Anrufe an eine API zu erleichtern. Werfen Sie einen Blick auf this Beispiel einer Remote-Fassade. Die Idee hier ist, dass die vollständige Implementierung des Codes auf dem Server vom Client versteckt ist. Der Client ruft eine API-Methode auf, die wiederum 1 oder mehr API-Aufrufe auf dem Server ausführen kann.

Adapter

Ein gutes Beispiel für diese here, auf Wikipedia gefunden werden kann.Ein Client-Objekt Source möchte eine Methode für ein anderes Objekt Target aufrufen, aber die Oberfläche dieses anderen Objekts unterscheidet sich von dem, was der Client erwartet.

Geben Sie das Adapterobjekt ein.

Es kann einen Anruf von der Source Objekt und hinter den Kulissen, rufen Sie die Target Methode, die verwendet werden sollte.

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

Was Proxy, ich habe keine Erfahrung mit diesem Design-Muster.

Verwandte Themen