Smalltalk über Designmuster (7) – Dekorationsmuster
Kolumneneinführung
Spaltenadresse
Kolumneneinführung
Es analysiert und fasst hauptsächlich die 23 gängigen Designmuster zusammen, die derzeit auf dem Markt sind. Ich hoffe, dass interessierte Freunde einen Blick darauf werfen können, und es wird kontinuierlich aktualisiert. Ich hoffe, dass Sie mich beaufsichtigen können und wir gemeinsam lernen und Fortschritte machen können. Kommt alle zusammen.
Dekorativer Modus
Decorator Pattern ist ein strukturelles Designmuster, mit dem Sie einem Objekt dynamisch zusätzliche Funktionen hinzufügen können, ohne seine ursprüngliche Klasse zu ändern. Indem Sie ein Objekt in eine Dekoratorklasse einschließen, können Sie die Funktionalität schrittweise hinzufügen, ohne die Struktur des vorhandenen Objekts zu ändern.
Charakter im Dekorationsmodus
Komponente (abstrakte Komponente)
Definiert die gemeinsame Schnittstelle konkreter Komponenten und Dekoratoren, die eine abstrakte Klasse oder Schnittstelle sein kann.
ConcreteComponent (Betonbauteil)
Die durch die abstrakte Komponente definierte Schnittstelle wird implementiert und ist das ursprüngliche Objekt, das dekoriert wird.
Dekorateur (abstrakter Dekorateur)
Enthält einen Verweis auf eine konkrete Komponente und implementiert die von der abstrakten Komponente definierte Schnittstelle.
ConcreteDecorator (Betondekorateur)
Verwenden Sie Dekoratoren, um bestimmte Komponenten zu erweitern oder zu ändern und zusätzliche Funktionen hinzuzufügen.
Arbeitsprozess
Erste
Definieren Sie eine abstrakte Komponente (Component), die die Schnittstellenmethoden deklariert, die konkreten Komponenten und Dekoratoren gemeinsam sind.
Zweitens
Erstellen Sie eine konkrete Komponente (ConcreteComponent), die die Schnittstellenmethode der abstrakten Komponente implementiert und das ursprüngliche Objekt ist, das dekoriert wird.
Dann
Erstellen Sie einen abstrakten Dekorator (Decorator), der auch die Schnittstellenmethode der abstrakten Komponente implementiert und eine Mitgliedsvariable enthält, die auf eine bestimmte Komponente (normalerweise einen abstrakten Komponententyp) verweist, um das dekorierte Objekt zu speichern.
zu guter Letzt
Erstellen Sie einen konkreten Dekorator (ConcreteDecorator), der vom abstrakten Dekorator erbt und basierend auf dem Dekorator zusätzliche Funktionen hinzufügt. Konkrete Dekoratoren überschreiben normalerweise die Schnittstellenmethoden abstrakter Komponenten, um vor und nach dem Aufruf eine zusätzliche Verarbeitung durchzuführen, und rufen dann die entsprechende Methode des dekorierten Objekts auf.
Implementierung von Java-Code
// Step 1: 定义抽象组件
interface Component {
void operation();
}
// Step 2: 创建具体组件
class ConcreteComponent implements Component {
public void operation() {
System.out.println("执行具体组件的操作");
}
}
// Step 3: 创建抽象装饰器
abstract class Decorator implements Component {
protected Component component;
public Decorator(Component component) {
this.component = component;
}
public void operation() {
component.operation();
}
}
// Step 4: 创建具体装饰器
class ConcreteDecorator extends Decorator {
public ConcreteDecorator(Component component) {
super(component);
}
public void operation() {
// 在调用具体组件操作前进行额外处理
System.out.println("在调用具体组件操作前进行额外处理");
// 调用具体组件的操作
super.operation();
// 在调用具体组件操作后进行额外处理
System.out.println("在调用具体组件操作后进行额外处理");
}
}
// 使用装饰模式
public class Main {
public static void main(String[] args) {
// 创建具体组件对象
Component component = new ConcreteComponent();
// 创建具体装饰器对象,并将具体组件对象传入
Component decorator = new ConcreteDecorator(component);
// 调用装饰后的操作
decorator.operation();
}
}
Code-Analyse
Component ist eine abstrakte Komponentenschnittstelle und ConcreteComponent ist eine konkrete Komponentenklasse, die die Methoden der abstrakten Komponentenschnittstelle implementiert. Decorator ist eine abstrakte Dekoratorklasse, die die abstrakte Komponentenschnittstelle implementiert und eine Mitgliedsvariable des abstrakten Komponententyps enthält. ConcreteDecorator ist eine konkrete Dekoratorklasse, die von der abstrakten Dekoratorklasse erbt, die Operationsmethode überschreibt und vor und nach dem Aufruf zusätzliche Verarbeitung hinzufügt.
Erstellen Sie in der Hauptfunktion zunächst das Betonkomponentenobjekt ConcreteComponent, übergeben Sie es dann an den Konstruktor des Betondekoratorobjekts ConcreteDecorator und umschließen Sie die Betonkomponente mit dem Dekorator. Wenn schließlich die dekorierte Operation aufgerufen wird, werden zusätzliche Verarbeitungs- und spezifische Komponentenoperationen in einer bestimmten Reihenfolge ausgeführt.
Vor- und Nachteile-Analyse
Vorteil
Beachten Sie das Öffnungs- und Schließprinzip
Sie können die Funktionalität eines Objekts erweitern, indem Sie eine neue Dekoratorklasse hinzufügen, ohne den vorhandenen Code zu ändern.
Funktionen können dynamisch hinzugefügt/entfernt werden
Sie können Objektfunktionen nach Bedarf dynamisch hinzufügen oder löschen und verschiedene Dekoratoren kombinieren, um unterschiedliche Verhaltenskombinationen zu erzielen.
Befolgen Sie das Prinzip der Einzelverantwortung
Bestimmte Komponentenklassen sind nur für Kernfunktionen verantwortlich, und bestimmte Dekoratorklassen konzentrieren sich nur auf zusätzliche Funktionen. Jede Klasse hat klare Verantwortlichkeiten und eine hohe Wartbarkeit.
Die Dekoratorklasse ist unabhängig von der konkreten Komponentenklasse
Die Beziehung zwischen der Dekoratorklasse und der spezifischen Komponentenklasse ist lose gekoppelt und kann unabhängig geändert werden. Das Hinzufügen oder Entfernen von Dekoratoren hat keinen Einfluss auf das Verhalten anderer Komponenten.
Mangel
Kann zu viele konkrete Dekorateurklassen erzeugen
Wenn das System viele Funktionen enthält, die erweitert werden müssen, kann dies zu einer großen Anzahl spezifischer Dekoratorklassen führen, was die Komplexität des Systems erhöht.
Die Schnittstelle zwischen dem Dekorateur und der Komponentenklasse ist inkonsistent
Im Dekoratormuster sind die Schnittstellen der Dekoratorklasse und der spezifischen Komponentenklasse inkonsistent, was dazu führt, dass der Client zwischen Aufrufen unterscheiden muss.
Zusammenfassen
Dekorationsmuster bieten eine flexible, erweiterbare Möglichkeit, die Funktionalität eines Objekts zu ändern und gleichzeitig eine einfache Schnittstelle und Wartbarkeit des Codes beizubehalten. Sie müssen jedoch die Komplexität der Erweiterung und die Konsistenz der Objektschnittstelle in Einklang bringen.