Unterschied zwischen Interzeptoren und Dekoratoren

8

Gibt es Unterschiede zwischen Interzeptoren und Dekoratoren in Java? Kann ich genau genommen Dinge mit Dekoratoren umsetzen, die mit Interzeptoren nicht möglich sind und umgekehrt?

Außer dem Problem, dass ich den Methodennamen untersuchen müsste, um ein methodenspezifisches Verhalten in einem Interceptor hinzuzufügen:

Interceptor:

%Vor%

Dekorateur:

%Vor%

Oder ist es legitim zu sagen, dass ich das gesamte Verhalten von Dekoratoren mit Abfängern reproduzieren kann, aber es ist komfortabler Dekorateure zu verwenden?

    
ammerzon 29.02.2016, 18:04
quelle

3 Antworten

8

Ein Unterschied wäre, wie Ihr Beispiel zeigt, dass Sie mit Decorator in der Regel 1 Decorator pro 1 dekorierter Klasse / Schnittstelle schreiben.

Mit Abfangjägern, die Teil des AOP -Konzepts sind, schreibst du einen Interceptor für eine Reihe von Klassen / Methoden, z Sie fangen alle DAO Methoden ab und stellen sicher, dass eine Transaktion vor dem Aufruf offen ist und danach geschlossen wird.

Ein Beispiel für einen Interceptor im Frühjahr AOP, zuerst deklarieren Sie eine pointcut (was zu tun ist), hier passen Sie jede Methode aus der MyDao-Klasse an, die mit Einfügen beginnt und über Argumente und einen beliebigen Rückgabetyp verfügt.

%Vor%

Dann deklarieren Sie eine Umgebung Ratschlag , der auf den Pointcut verweist

%Vor%

Dennoch hat jeder Teil seine eigenen Vor- / Nachteile. Z.B. Interzeptoren sind flexibler, aber stellen Sie sich vor, Sie ändern den Namen der Methode, wenn Sie einen Dekorator verwenden, erhalten Sie wahrscheinlich einen Compiler-Fehler, mit Interzeptoren, wird es nicht übereinstimmen und Ihre 'um' Logik nicht ausführen.

    
Bax 29.02.2016, 18:14
quelle
2

Im Allgemeinen wird ein Decorator verwendet, um neue Funktionen hinzuzufügen oder vorhandene Funktionen zu ändern. Es verwendet Komposition als Alternative zur Vererbung. Decorators stellen oft zusätzliche APIs (Methoden) zur Verfügung, die in den dekorierten Klassen nicht verfügbar sind.

Andererseits wird AOP (z. B. ein Interzeptor) verwendet, um das bestehende Verhalten zu verbessern. Es fügt keine zusätzlichen APIs hinzu und ändert im Allgemeinen keine vorhandenen Funktionen. Es wird durch den Aufruf der vorhandenen Funktionalität ausgelöst und reagiert mit einigen Aktionen. Die vorhandene Funktionalität sowie die vorhandene API bleiben jedoch unverändert.

Ich bin mit den JEE-Implementierungen nicht vertraut, daher haben sie möglicherweise die Linien zwischen diesen beiden Mustern verwischt. Wichtige Punkte zu vergleichen wäre,

  • Kann @Interceptor neue Methoden einführen oder nur existierende Methoden ausführen?
  • Kann @Interceptor vorhandene Methoden überschreiben oder nur zusätzliches Verhalten anhängen?
  • Kann @Decorator auf Pakete & amp; Klassenhierarchien, oder ist es durch eine dieser Klassen eingeschränkt?

Neben funktionalen Unterschieden zwischen den beiden Mustern kann es auch interessant sein, mögliche Leistungsunterschiede zu berücksichtigen. Ich würde erwarten, dass @Interceptor wesentlich langsamer ist, da es Methodenaufrufe zur Laufzeit untersuchen muss, während @Decorator -Aufrufe zur Kompilierzeit aufgelöst werden können.

    
jaco0646 29.02.2016 20:49
quelle
0

Dekoratoren, die Interzeptoren sehr ähnlich sind, mit zwei interessanten Unterschieden:

  1. Ein Decorator muss die Schnittstelle implementieren, die er schmückt (und kann trotzdem abstrakt sein, so dass er die Methoden nicht implementieren muss)

  2. Ein Dekorator kann eine Referenz auf das Objekt haben, das er dekoriert. Es wird durch Injektion gemacht

Hinweis: Ссылка

    
Aajan 29.02.2016 18:15
quelle