wake-up-neo.com

Unterschiede zwischen Proxy- und Decorator-Pattern

Können Sie eine gute Erklärung geben, was ist der Unterschied zwischen Proxy und Decorator?

Der Hauptunterschied, den ich sehe, ist, dass, wenn wir annehmen, dass ProxyZusammensetzung und DecoratorAggregation verwendet, dann scheint es klar zu sein Wenn Sie mehrere (eine oder mehrere) Dekorateure verwenden, können Sie Funktionalitäten zu einer bereits vorhandenen Instanz (Dekorieren) ändern/hinzufügen, während Proxy eine eigene innere Instanz der proxied-Klasse und Delegierte dazu hat, die einige hinzufügen zusätzliche Funktionen (Proxy-Verhalten).

Die Frage ist - Ist Proxy mit Aggregation erstellt noch Proxy oder eher Decorator? Darf (per Definition in GoF-Mustern) Proxy mit Aggregation erstellt werden?

95

Decorator Pattern fokussiert das dynamische Hinzufügen von Funktionen zu einem Objekt, während Proxy Pattern den Zugriff auf ein Objekt steuert.

BEARBEITEN: -

Die Beziehung zwischen einem Proxy und dem realen Subjekt wird normalerweise zur Kompilierzeit festgelegt. Proxy instanziiert es auf eine bestimmte Weise, während Decorator dem Subjekt zur Laufzeit zugewiesen wird, wobei nur die Benutzeroberfläche des Subjekts bekannt ist. 

67
Rahul Tripathi

Die akzeptierte Antwort ist nicht ganz richtig. Der eigentliche Unterschied besteht nicht in der Inhaberschaft (Zusammensetzung versus Aggregation), sondern in der Typinformation.

Ein Dekorateur ist immer an seinem Beauftragten vorbeigekommen. Ein Proxy könnte es selbst erstellen, oder er könnte habe es gespritzt.

Aber ein Proxy kennt immer den (spezifischeren) Typ des Delegierten. Mit anderen Worten, der Proxy und sein Stellvertreter haben denselben Basistyp, aber der Proxy zeigt auf einen abgeleiteten Typ. A Decorator zeigt auf einen eigenen Basistyp. Der Unterschied liegt also in der Kompilierungszeit der Informationen über den Typ des Delegierten.

In einer dynamischen Sprache gibt es keinen Unterschied, wenn dem Delegierten dieselbe Benutzeroberfläche zugewiesen wird.

Die Antwort auf Ihre Frage lautet "Ja".

91
cdunn2001

Decorator Referenz für ein dekoriertes Objekt erhalten (normalerweise durch Konstruktor), während Proxy dafür verantwortlich ist.

Proxy kann das Wrapping-Objekt überhaupt nicht instanziieren (wie dies bei ORMs der Fall ist, um unnötigen Zugriff auf die Datenbank zu verhindern, wenn Objektfelder/Getters nicht verwendet werden), während Decorator immer eine Verknüpfung zu der tatsächlich umschlossenen Instanz enthält.

Proxy wird normalerweise von Frameworks verwendet, um Sicherheit oder Caching/Lazing hinzuzufügen, und wird von Framework (nicht von regulären Entwicklern selbst) erstellt.

Decorator wird normalerweise verwendet, um alten oder älteren Klassen neues Verhalten durch den Entwickler selbst hinzuzufügen, der auf der Schnittstelle und nicht auf der tatsächlichen Klasse basiert (so dass er auf eine Vielzahl von Schnittstelleninstanzen angewendet werden kann. Proxy handelt es sich dabei um eine konkrete Klasse).

37
gavenkoa

Hauptunterschiede:

  1. Proxy bietet dieselbe Schnittstelle. Decorator bietet eine erweiterte Benutzeroberfläche.
  2. Decorator und Proxy haben unterschiedliche Zwecke, aber ähnliche Strukturen. Beide beschreiben, wie eine Indirektionsebene für ein anderes Objekt bereitgestellt werden kann, und die Implementierungen enthalten einen Verweis auf das Objekt, an das sie Anforderungen weiterleiten.
  3. Decorator kann als degenerierter Verbund mit nur einer Komponente betrachtet werden. Ein Dekorateur fügt jedoch zusätzliche Verantwortlichkeiten hinzu - Es ist nicht für die Objektaggregation vorgesehen.
  4. Decorator unterstützt rekursive Komposition
  5. Die Klasse Decorator deklariert eine Beziehung composition zur Schnittstelle LCD (Lowest Class Denominator), und dieses Datenelement wird in seinem Konstruktor initialisiert.
  6. Verwenden Sie Proxy für die verzögerte Initialisierung, die Leistungsverbesserung durch Zwischenspeichern des Objekts und Zugriffskontrolle auf den Client/Anrufer.

Sourcemaking Artikel zitiert die Ähnlichkeiten und Unterschiede in hervorragender Weise.

Verwandte SE-Fragen/Links:

Wann das Dekorateur-Muster verwenden?

Was ist der genaue Unterschied zwischen Adapter- und Proxy-Mustern?

14
Ravindra babu

Proxy und Decorator unterscheiden sich in ihrem Zweck und konzentrieren sich auf die interne Implementierung. Proxy ist für die Verwendung eines Remote-, Cross-Process- oder Cross-Network-Objekts wie ein lokales Objekt. Decorator dient dazu, der ursprünglichen Benutzeroberfläche neues Verhalten hinzuzufügen.

Obwohl beide Muster in der 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 zusätzlichen Verhaltens. 

0
James Lin