Heim  >  Artikel  >  Java  >  Dekorationsmuster

Dekorationsmuster

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-05 03:40:02219Durchsuche

Was ist ein Dekorationsmuster?

Decorator-Muster ist ein strukturelles Designmuster, das einem Objekt dynamisch zusätzliche Verhaltensweisen hinzufügt. Dekoratoren bieten einen flexiblen Erweiterungsgrund durch Zusammensetzung statt durch Unterklassen (Vererbung).

Wann sollte man es verwenden?

Verwenden Sie das Decorator-Muster, wenn Sie ein Objekt erstellen möchten, indem Sie zur Laufzeit kleine Verhaltensweisen hinzufügen.

UML-Diagramm

Decorator Pattern

Die Dekoratorklasse verwendet Komposition und Vererbung. Es ist wichtig, deren Absicht zu verstehen.
Im Dekoratormuster verwenden wir denselben Typ für Komponenten und Dekoratoren. Der Dekorator setzt das Komponentenobjekt zusammen, um das Verhalten abzurufen, d. h. die im Komponentenobjekt definierten Felder oder Methoden abzurufen. Während Decorator Component erbt (erweitert), sodass Decorator-Objekt als Component-Objekt deklariert werden kann.

Das Dekorationsmuster erreicht das Offen-Geschlossen-Prinzip, nämlich offen für Erweiterungen und geschlossen für Änderungen. Es ist einfach, Komponenten oder Dekoratoren hinzuzufügen. Wenn Sie beispielsweise einen weiteren konkreten Dekorator hinzufügen möchten, müssen Sie lediglich eine Klasse erstellen, die ihn darstellt und die Dekorator-Klasse erweitert.

Beispiel

Stellen Sie sich vor, wir entwickeln ein System für eine Eisdiele. Der Laden bietet verschiedene Eissorten und Toppings. Das System muss eine Eiscremebeschreibung (einschließlich der Toppings) und den Preis anzeigen.

Decorator Pattern

  • Komponenten (Eis) und Dekorateure (Toppings) haben eine gemeinsame IceCream-Schnittstellenklasse, die beide als IceCream-Objekt deklariert werden.
  • Jedes konkrete Eis hat Vorrang vor der Kostenmethode, da die Preise jeweils unterschiedlich sind.
  • Topping-Klasse stellt eine Schnittstelle für konkrete Toppings bereit und enthält Verweise auf ein Eis.
  • Wenn das System ein weiteres Topping benötigt, beispielsweise eine Karamellquelle, müssen Sie nur die Klasse „CaramelSource“ erstellen, die die Topping-Klasse erweitert.

Implementierung in Java

Eiscremekurs:

// Component class
public abstract class IceCream {

    public String description = "Unknown ice cream";

    public String getDescription() {
        return description;
    }

    public abstract double cost();
}

Schokoladen-Eiscreme-Kurs:

// Concrete component class
public class ChocolateIceCream extends IceCream {

    public ChocolateIceCream() {
        description = "ChocolateIceCream";
    }

    @Override
    public double cost() {
        return 1.99;
    }
}

Top-Klasse:

// Base decorator class
public abstract class Topping extends IceCream {

    public IceCream iceCream;

    // All subclasses (concrete decorator classes) need to implement getDescription method,
    // by declaring this method as abstract, we enforce all subclasses to implement this method
    public abstract String getDescription();
}

MapleNuts-Klasse:

// Concrete decorator class
public class MapleNuts extends Topping {

    public MapleNuts(IceCream iceCream) {
        this.iceCream = iceCream;
    }

    @Override
    public String getDescription() {
        return iceCream.getDescription() + ", MapleNuts";
    }

    @Override
    public double cost() {
        return iceCream.cost() + .30;
    }
}

PeanutButterShell-Klasse:

// Concrete decorator class
public class PeanutButterShell extends Topping {

    public PeanutButterShell(IceCream iceCream) {
        this.iceCream = iceCream;
    }

    @Override
    public String getDescription() {
        return iceCream.getDescription() + ", PeanutButterShell";
    }

    @Override
    public double cost() {
        return iceCream.cost() + .30;
    }
}

Client-Klasse:

public class Client {

    public static void main(String[] args) {
        IceCream iceCream = new ChocolateIceCream();
        System.out.println(iceCream.getDescription() + ", $" + iceCream.cost());

        iceCream = new MapleNuts(iceCream);
        System.out.println(iceCream.getDescription() + ", $" + iceCream.cost());

        iceCream = new PeanutButterShell(iceCream);
        System.out.println(iceCream.getDescription() + ", $" + iceCream.cost());
    }
}

Ausgabe:

ChocolateIceCream, .99
ChocolateIceCream, MapleNuts, .29
ChocolateIceCream, MapleNuts, PeanutButterShell, .59

Sie können alle Entwurfsmusterimplementierungen hier überprüfen.
GitHub-Repository


P.S.
Ich bin neu im Schreiben von Tech-Blogs. Wenn Sie Ratschläge zur Verbesserung meines Schreibens haben oder einen verwirrenden Punkt haben, hinterlassen Sie bitte einen Kommentar!
Vielen Dank fürs Lesen :)

Das obige ist der detaillierte Inhalt vonDekorationsmuster. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn