176 Stimmen

Unterschied zwischen den Entwurfsmustern Facade, Proxy, Adapter und Decorator?

Was ist der Unterschied zwischen dem Fassade , Vollmacht , Adapter y Dekorateur Entwurfsmuster?

Aus allgemeiner Sicht scheinen solche Muster dasselbe zu tun, nämlich: eine API verpacken und den Zugang zu ihr ermöglichen .

Wie lassen sich diese Muster unterscheiden?
Wie erkennt man, wann ein Muster besser passt als ein anderes?

335voto

dirkgently Punkte 104289

Adapter passt eine bestimmte Klasse/Objekt an eine neue Schnittstelle an. Im ersten Fall wird in der Regel Mehrfachvererbung eingesetzt. Im letzteren Fall wird das Objekt von einem konformen Adapterobjekt umhüllt und weitergereicht. Das Problem, das wir hier lösen, ist das der nicht kompatible Schnittstellen .

Fassade ist eher ein einfaches Tor zu einer komplizierten Reihe von Funktionen. Sie schaffen eine Blackbox für Ihre Kunden, damit diese sich weniger Sorgen machen müssen, d.h. Schnittstellen zu vereinfachen .

Vollmacht bietet dieselbe Schnittstelle wie die Proxied-for-Klasse und erledigt in der Regel einige Aufgaben selbständig. (Anstatt also mehrere Kopien eines schweren Objekts zu erstellen X Sie erstellen Kopien eines leichtgewichtigen Proxys P die ihrerseits die X und übersetzt Ihre Anrufe nach Bedarf). Sie lösen das Problem, dass der Kunde nicht mehr ein schweres und/oder komplexes Objekt verwalten .

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

Nun, da Sie Dekorator involviert haben, werden Sie wahrscheinlich wissen wollen, warum die Betonung auf dem Wort Objekt liegt -- einige Sprachen (wie Java) erlauben einfach keine virtuelle Vererbung (d.h. Mehrfachvererbung, wie C++ es tut), um Ihnen zu erlauben, dies zur Kompilierzeit zu erreichen.

Da wir mehrere Erbschaften (und den gefürchteten Diamanten) eingefügt haben, werden Sie auf Folgendes achten mixins -- die sind geordnete lineare Verkettung von Schnittstellen um die Probleme der Mehrfachvererbung zu umgehen. Allerdings passen Mixins nicht so gut zusammen. Und wir enden mit Eigenschaften -- ja diese zustandslose kleine Verhaltensblöcke die in C++ immer wieder in Template-Parametern auftaucht. Traits versuchen, die Probleme der Komposition und Dekomposition von Verhalten auf elegante Weise anzugehen, ohne dabei auf Mehrfachvererbung oder geordnete Verkettung zu setzen.

19voto

Jason Evans Punkte 28439

Fassade

Sie könnten beispielsweise eine Fassade verwenden, um den Aufruf einer API zu vereinfachen. Werfen Sie einen Blick auf ce Beispiel für eine Fernfassade. Die Idee dahinter ist, dass die vollständige Implementierung des Codes auf dem Server vor dem Client verborgen ist. Der Client ruft eine API-Methode auf, die ihrerseits einen oder mehrere API-Aufrufe auf dem Server tätigen kann.

Adapter

Ein gutes Beispiel hierfür ist aquí auf Wikipedia. Ein Kundenobjekt Source eine Methode auf einem anderen Objekt aufrufen möchte Target , aber die Schnittstelle des anderen Objekts unterscheidet sich von dem, was der Kunde erwartet.

Geben Sie das Adapterobjekt ein.

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

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

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X