Können Sie eine gute Erklärung geben, was der Unterschied zwischen Proxy und Decorator ist ?
Der wesentliche Unterschied ich sehe , ist , dass , wenn wir davon ausgehen , dass Proxy verwendet Zusammensetzung und Dekorateur Verwendungen Aggregation dann scheint es klar zu sein , dass durch mehrfache Verwendung von (einem oder mehreren) Dekorateure Sie können Funktionalitäten ändern / hinzufügen Instanz (deco) zu dem bereits bestehenden, während Der Proxy verfügt über eine eigene innere Instanz der Proxy-Klasse und delegiert diese mit zusätzlichen Funktionen (Proxy-Verhalten).
Die Frage ist: Ist der mit Aggregation erstellte Proxy immer noch Proxy oder eher Decorator ? Darf (per Definition in GoF-Mustern) ein Proxy mit Aggregation erstellt werden?
quelle
Antworten:
Hier ist das direkte Zitat aus dem GoF (Seite 216).
Beliebte Antworten weisen darauf hin, dass ein Proxy den konkreten Typ seines Delegaten kennt. Aus diesem Zitat können wir erkennen, dass dies nicht immer der Fall ist.
Der Unterschied zwischen Proxy und Decorator gemäß GoF besteht darin, dass Proxy den Client einschränkt . Dekorateur nicht. Proxy kann beschränken , was ein Client tut durch Zugriff auf Funktionen zu steuern; oder es kann einschränken, was ein Client weiß, indem Aktionen ausgeführt werden, die für den Client unsichtbar und unbekannt sind. Decorator macht das Gegenteil: Es verbessert das, was sein Delegierter tut, auf eine Weise, die für Kunden sichtbar ist.
Wir könnten sagen, dass Proxy eine Black Box ist, während Decorator eine White Box ist.
Die Kompositionsbeziehung zwischen Wrapper und Delegat ist die falsche Beziehung, auf die Sie sich konzentrieren müssen, wenn Sie Proxy mit Decorator kontrastieren, da die Komposition das Merkmal ist, das diese beiden Muster gemeinsam haben. Die Beziehung zwischen Wrapper und Client unterscheidet diese beiden Muster.
quelle
Der wirkliche Unterschied ist nicht das Eigentum (Zusammensetzung versus Aggregation), sondern die Typinformation.
Ein Dekorateur wird immer an seinen Delegierten übergeben. Ein Proxy könnte es selbst schaffen, oder er könnte haben es injiziert.
Ein Proxy kennt jedoch immer den (spezifischeren) Typ des Delegierten. Mit anderen Worten, der Proxy und sein Delegierter haben denselben Basistyp, aber der Proxy zeigt auf einen abgeleiteten Typ. Ein Dekorateur zeigt auf seinen eigenen Basistyp. Der Unterschied besteht also in den Informationen zur Kompilierungszeit über den Typ des Delegierten.
In einer dynamischen Sprache gibt es keinen Unterschied, wenn der Delegierte injiziert wird und zufällig dieselbe Schnittstelle hat.
Die Antwort auf Ihre Frage lautet "Ja".
quelle
Das Dekorationsmuster konzentriert sich auf das dynamische Hinzufügen von Funktionen zu einem Objekt, während sich das Proxy- Muster auf die Steuerung des Zugriffs auf ein Objekt konzentriert.
BEARBEITEN:-
Die Beziehung zwischen einem Proxy und dem realen Betreff wird normalerweise zur Kompilierungszeit festgelegt. Der Proxy instanziiert sie auf irgendeine Weise, während Decorator dem Betreff zur Laufzeit zugewiesen wird und nur die Benutzeroberfläche des Betreffs kennt.
quelle
Der Dekorateur erhält eine Referenz für das dekorierte Objekt (normalerweise durch den Konstrukteur), während der Proxy dafür verantwortlich ist.
Der Proxy instanziiert möglicherweise überhaupt kein Wrapping-Objekt (wie dies bei ORMs der Fall ist, um unnötigen Zugriff auf die Datenbank zu verhindern, wenn keine Objektfelder / Getter verwendet werden), während Decorator immer die Verknüpfung zur tatsächlich umhüllten Instanz hält.
Proxy, der normalerweise von Frameworks zum Hinzufügen von Sicherheit oder zum Zwischenspeichern / Löschen verwendet wird und vom Framework erstellt wird (nicht vom regulären Entwickler selbst).
Decorator wird normalerweise verwendet, um alten oder älteren Klassen vom Entwickler selbst neues Verhalten hinzuzufügen, basierend auf der Schnittstelle und nicht auf der tatsächlichen Klasse (daher funktioniert es bei einer Vielzahl von Schnittstelleninstanzen, Proxy handelt von konkreten Klassen).
quelle
Hauptunterschiede:
Der Artikel über die Herstellung von Quellen zitiert die Ähnlichkeiten und Unterschiede auf hervorragende Weise.
Verwandte SE Fragen / Links:
Wann sollte das Dekorationsmuster verwendet werden?
Was ist der genaue Unterschied zwischen Adapter- und Proxy-Mustern?
quelle
Proxy und Decorator unterscheiden sich in ihrem Zweck und wo sie sich auf die interne Implementierung konzentrieren. Proxy dient zur Verwendung eines Remote-, prozess- oder netzwerkübergreifenden Objekts, als wäre es ein lokales Objekt. Decorator dient zum Hinzufügen eines neuen Verhaltens zur ursprünglichen Benutzeroberfläche.
Während beide Muster in ihrer Struktur ähnlich sind, liegt der Hauptteil der Komplexität von Proxy darin, eine ordnungsgemäße Kommunikation mit dem Quellobjekt sicherzustellen. Decorator hingegen konzentriert sich auf die Implementierung des hinzugefügten Verhaltens.
quelle
Es hat eine Weile gedauert, um diese Antwort herauszufinden und was sie wirklich bedeutet. Einige Beispiele sollen es klarer machen.
Proxy
zuerst:Und :
Und es gibt einen Anrufer davon
Authorization
, einen ziemlich dummen:Bisher nichts Ungewöhnliches, oder? Beziehen Sie ein Token von einem bestimmten Dienst und verwenden Sie dieses Token. Jetzt kommt eine weitere Anforderung an das Bild: Fügen Sie die Protokollierung hinzu: Das heißt, Sie protokollieren das Token jedes Mal. In diesem Fall ist es einfach: Erstellen Sie einfach Folgendes
Proxy
:Wie würden wir das nutzen?
Beachten Sie, dass
LoggingDBAuthorization
hält eine InstanzDBAuthorization
. BeidesLoggingDBAuthorization
undDBAuthorization
implementierenAuthorization
.DBAuthorization
) der Basisschnittstelle (Authorization
). Mit anderen Worten, ein Proxy weiß genau, was Proxy ist.Decorator
::Es beginnt fast genauso wie
Proxy
mit einer Schnittstelle:und eine Implementierung davon:
Und jetzt möchten wir einen erfahreneren Kandidaten hinzufügen, der die Interview-Punktzahl plus die eines anderen hinzufügt
JobSeeker
:Beachten Sie, wie ich das gesagt habe, plus das von einem anderen JobSeeker , nicht
Newbie
. ADecorator
weiß nicht genau, was es dekoriert, es kennt nur den Vertrag dieser dekorierten Instanz (es weiß davonJobSeeker
). Beachten Sie hier, dass dies anders ist als einProxy
; das weiß dagegen genau, was es dekoriert.Sie könnten sich fragen, ob es in diesem Fall tatsächlich einen Unterschied zwischen den beiden Entwurfsmustern gibt? Was wäre, wenn wir versuchen würden, das
Decorator
als zu schreibenProxy
?Dies ist definitiv eine Option und zeigt, wie nahe diese Muster sind. Sie sind weiterhin für verschiedene Szenarien vorgesehen, wie in den anderen Antworten erläutert.
quelle
Proxy bietet dieselbe Schnittstelle für das umschlossene Objekt, Decorator bietet ihm eine erweiterte Schnittstelle und Proxy verwaltet normalerweise den Lebenszyklus seines Serviceobjekts selbst, während die Zusammensetzung der Decorators immer vom Client gesteuert wird.
quelle