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).
Verwenden Sie das Decorator-Muster, wenn Sie ein Objekt erstellen möchten, indem Sie zur Laufzeit kleine Verhaltensweisen hinzufügen.
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.
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.
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!