Smalltalk über Designmuster (7) – Dekorationsmuster

Kolumneneinführung

Spaltenadresse

Verknüpfung

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.
Fügen Sie hier eine Bildbeschreibung ein

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

Fügen Sie hier eine Bildbeschreibung ein

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.

Fügen Sie hier eine Bildbeschreibung ein

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.
Fügen Sie hier eine Bildbeschreibung ein

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.
Fügen Sie hier eine Bildbeschreibung ein

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.

おすすめ

転載: blog.csdn.net/weixin_74888502/article/details/133437213