Design Patterns - Dekorationsmuster
Mit dem Dekorationsmuster kann ein Benutzer einem vorhandenen Objekt neue Funktionen hinzufügen, ohne dessen Struktur zu ändern. Diese Art von Entwurfsmuster fällt unter das Strukturmuster, da dieses Muster als Wrapper für vorhandene Klassen fungiert.
Dieses Muster erstellt eine Dekorationsklasse, die die ursprüngliche Klasse umschließt und zusätzliche Funktionen bietet, wobei die Signatur der Klassenmethoden intakt bleibt.
Wir demonstrieren die Verwendung von Dekorationsmustern anhand des folgenden Beispiels, in dem wir eine Form mit einer bestimmten Farbe dekorieren, ohne die Formklasse zu ändern.
Implementierung
Wir werden eine Shape- Schnittstelle und konkrete Klassen erstellen, die die Shape- Schnittstelle implementieren . Anschließend erstellen wir eine abstrakte Dekorationsklasse ShapeDecorator, die die Shape- Schnittstelle implementiert und das Shape- Objekt als Instanzvariable verwendet.
RedShapeDecorator ist eine konkrete Klasse, die ShapeDecorator implementiert .
DecoratorPatternDemo , unsere Demo-Klasse, verwendet RedShapeDecorator , um Shape- Objekte zu dekorieren .
Schritt 1
Erstellen Sie eine Schnittstelle.
Shape.java
public interface Shape {
void draw();
}
Schritt 2
Erstellen Sie konkrete Klassen, die dieselbe Schnittstelle implementieren.
Rectangle.java
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Rectangle");
}
}
Circle.java
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Circle");
}
}
Schritt 3
Erstellen Sie eine abstrakte Dekorationsklasse, die die Formschnittstelle implementiert.
ShapeDecorator.java
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape){
this.decoratedShape = decoratedShape;
}
public void draw(){
decoratedShape.draw();
}
}
Schritt 4
Erstellen Sie eine konkrete Dekorationsklasse, die die ShapeDecorator- Klasse erweitert.
RedShapeDecorator.java
public class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
}
@Override
public void draw() {
decoratedShape.draw();
setRedBorder(decoratedShape);
}
private void setRedBorder(Shape decoratedShape){
System.out.println("Border Color: Red");
}
}
Schritt 5
Verwenden Sie den RedShapeDecorator , um Shape- Objekte zu dekorieren .
DecoratorPatternDemo.java
public class DecoratorPatternDemo {
public static void main(String[] args) {
Shape circle = new Circle();
Shape redCircle = new RedShapeDecorator(new Circle());
Shape redRectangle = new RedShapeDecorator(new Rectangle());
System.out.println("Circle with normal border");
circle.draw();
System.out.println("\nCircle of red border");
redCircle.draw();
System.out.println("\nRectangle of red border");
redRectangle.draw();
}
}
Schritt 6
Überprüfen Sie die Ausgabe.
Circle with normal border
Shape: Circle
Circle of red border
Shape: Circle
Border Color: Red
Rectangle of red border
Shape: Rectangle
Border Color: Red