Was ist das Decorator-Muster?
Fügen Sie einem Objekt dynamisch einige zusätzliche Verantwortlichkeiten hinzu. Im Hinblick auf das Hinzufügen von Funktionalität ist das Decorator-Muster flexibler als das Generieren von Unterklassen.
1. Struktur
Komponente: Definieren Sie eine Objektschnittstelle, die diesen Objekten dynamisch Verantwortlichkeiten hinzufügen kann.
interface Component { public void operation(); } ConcreteComponent : 实现 Component 定义的接口。 class ConcreteComponent implements Component { @Override public void operation() { System.out.println("初始行为"); } }
Decorator: Dekorative abstrakte Klasse, die Component erbt und die Funktionen der Component-Klasse von externen Klassen erweitert, aber für Component besteht keine Notwendigkeit, die Existenz von Decorator zu kennen.
class Decorator implements Component { // 持有一个 Component 对象,和 Component 形成聚合关系 protected Component component; // 传入要进一步修饰的对象 public Decorator(Component component) { this.component = component; } @Override // 调用要修饰对象的原方法 public void operation() { component.operation(); } }
ConcreteDecorator: Ein spezifisches Dekorationsobjekt, das die Funktion hat, der Komponente Verantwortlichkeiten hinzuzufügen.
class ConcreteDecoratorA extends Decorator { private String addedState = "新属性1"; public ConcreteDecoratorA(Component component) { super(component); } public void operation() { super.operation(); System.out.println("添加属性: " + addedState); } } class ConcreteDecoratorB extends Decorator { public ConcreteDecoratorB(Component component) { super(component); } public void operation() { super.operation(); AddedBehavior(); } public void AddedBehavior() { System.out.println("添加行为"); } }
Testcode
public class DecoratorPattern { public static void main(String[] args) { Component component = new ConcreteComponent(); component.operation(); System.out.println("======================================"); Decorator decoratorA = new ConcreteDecoratorA(component); decoratorA.operation(); System.out.println("======================================"); Decorator decoratorB = new ConcreteDecoratorB(decoratorA); decoratorB.operation(); } }
Laufergebnis
初始行为 ====================================== 初始行为 添加属性: 新属性1 ====================================== 初始行为 添加属性: 新属性1 添加行为
2. Anwendungsszenarien
1. Es ist notwendig, einem Objekt dynamisch und transparent Verantwortlichkeiten hinzuzufügen, das heißt ohne Auswirkungen auf andere Objekte.
2. Funktionen müssen einem Objekt dynamisch hinzugefügt werden und diese Funktionen können dynamisch widerrufen werden.
3. Durch die Permutation und Kombination einiger Grundfunktionen müssen sehr viele Funktionen hinzugefügt werden, was die Vererbungsbeziehung unrealistisch macht.
4. Wenn die Methode zum Generieren von Unterklassen nicht zur Erweiterung verwendet werden kann. In einem Fall gibt es möglicherweise eine große Anzahl unabhängiger Erweiterungen und es wird eine große Anzahl von Unterklassen generiert, um jede Kombination zu unterstützen, wodurch die Anzahl der Unterklassen explodiert. Ein anderer Fall könnte sein, dass die Klassendefinition ausgeblendet ist oder nicht zum Generieren von Unterklassen verwendet werden kann.
3. Wichtige Punkte
1. Dekorierte Objekte und reale Objekte haben die gleiche Schnittstelle. Auf diese Weise kann das Client-Objekt mit dem dekorierten Objekt auf die gleiche Weise interagieren wie ein reales Objekt.
2. Das Dekorationsobjekt enthält einen Verweis auf das reale Objekt.
3. Das Dekorationsobjekt nimmt alle Wünsche des Auftraggebers entgegen. Es leitet diese Anfragen an die realen Objekte weiter.
4. Das Dekorationsobjekt kann vor oder nach der Weiterleitung dieser Anfragen einige zusätzliche Funktionen hinzufügen. Dadurch wird sichergestellt, dass zusätzliche Funktionalität zur Laufzeit extern hinzugefügt werden kann, ohne die Struktur eines bestimmten Objekts zu ändern. Beim objektorientierten Design wird die funktionale Erweiterung einer bestimmten Klasse normalerweise durch Vererbung implementiert.
Das Obige ist eine Einführung in das Java-Decorator-Muster. Ich hoffe, es wird für das Lernen aller hilfreich sein.
Weitere Artikel zum Dekoratormuster in der Java-Designmusterserie finden Sie auf der chinesischen PHP-Website!