Tutorials  /  JavaScript

Erweiterung des Objektverhaltens mit dem Decorator Design Pattern

Ccentron Redaktion · Oktober 2024 ·4 Min. Lesezeit ·JavaScript, Tutorial

In der objektorientierten Programmierung wird das Verhalten eines Objekts normalerweise durch Vererbung oder Komposition erweitert. Diese Techniken führen jedoch Änderungen zur Compile-Zeit durch, wodurch sie zur Laufzeit unflexibel sind. Hier wird das Decorator Design Pattern besonders nützlich – es ermöglicht Modifikationen des Verhaltens eines Objekts dynamisch zur Laufzeit.

Stellen Sie sich vor, Sie müssen verschiedene Arten von Autos implementieren, die jeweils über spezifische Funktionen verfügen. Traditionell könnten Sie ein Car-Interface erstellen, eine grundlegende Implementierung wie BasicCar und diese dann auf SportsCar und LuxuryCar erweitern. Die Klassenhierarchie könnte folgendermaßen aussehen:

Car → BasicCar → SportsCar / LuxuryCar

Aber wenn Sie ein Auto erstellen möchten, das sowohl Sport- als auch Luxusmerkmale zur Laufzeit kombiniert, wird die Situation komplexer. Was ist, wenn Sie die Reihenfolge angeben müssen, in der diese Funktionen hinzugefügt werden? Bei zehn verschiedenen Autotypen wird das Management aller Kombinationen nur mit Vererbung fast unmöglich. Genau hier glänzt das Decorator Pattern.

Wie das Decorator Pattern funktioniert

Das Decorator Pattern ermöglicht es, das Verhalten eines einzelnen Objekts dynamisch hinzuzufügen, ohne das Verhalten anderer Objekte derselben Klasse zu beeinflussen. Dies ist besonders nützlich, wenn die Funktionalität eines Objekts zur Laufzeit erweitert werden muss, ohne die Struktur des Objekts zu ändern.

Um das Decorator Pattern zu implementieren, sind folgende Komponenten notwendig:

  1. Component Interface: Das Kern-Interface oder die abstrakte Klasse, die den Vertrag für alle Objekte definiert. In diesem Fall stellt Car das Component-Interface dar.
Code
public interface Car {
    public void assemble();
}
  1. Component Implementation: Eine grundlegende Implementierung des Component-Interfaces, wie z. B. BasicCar.
Code
public class BasicCar implements Car {
    @Override
    public void assemble() {
        System.out.print("Basic Car.");
    }
}
  1. Decorator Class: Diese Klasse implementiert das Component-Interface und enthält eine Referenz zu einem Car-Objekt (der Komponente). Sie dient als Basisklasse für den Dekorator.
Code
public class CarDecorator implements Car {
    protected Car car;
    
    public CarDecorator(Car c) {
        this.car = c;
    }
    
    @Override
    public void assemble() {
        this.car.assemble();
    }
}
  1. Concrete Decorators: Diese Klassen erweitern die Basisklasse des Dekorators und fügen zusätzliches Verhalten hinzu. Beispiele sind SportsCar und LuxuryCar.
Code
public class SportsCar extends CarDecorator {
    public SportsCar(Car c) {
        super(c);
    }
    
    @Override
    public void assemble() {
        super.assemble();
        System.out.print(" Adding features of Sports Car.");
    }
}

public class LuxuryCar extends CarDecorator {
    public LuxuryCar(Car c) {
        super(c);
    }
    
    @Override
    public void assemble() {
        super.assemble();
        System.out.print(" Adding features of Luxury Car.");
    }
}
VM

Passende Infrastruktur bei centron

Node-Anwendungen wollen deployt werden: ccloud³ VMs mit vollem Root-Zugriff ab 3,12 € im Monat – oder gleich als Managed Server, wenn der Betrieb nicht bei Ihnen liegen soll. Cloud Server mieten →

Klassendiagramm des Decorator Patterns

Die Klassenstruktur für dieses Pattern kann wie folgt visualisiert werden:

  • Car (Komponente)
    • BasicCar (Konkrete Komponente)
    • CarDecorator (Basis-Dekorator)
      • SportsCar (Konkreter Dekorator)
      • LuxuryCar (Konkreter Dekorator)

Testen des Decorator Patterns

Hier ist, wie Sie dieses Pattern in einem Testszenario verwenden können. Sie können Objekte von SportsCar, LuxuryCar erstellen oder sie zur Laufzeit dynamisch kombinieren:

Code
public class DecoratorPatternTest {
    public static void main(String[] args) {
        Car sportsCar = new SportsCar(new BasicCar());
        sportsCar.assemble();
        System.out.println("\n*****");
        
        Car sportsLuxuryCar = new SportsCar(new LuxuryCar(new BasicCar()));
        sportsLuxuryCar.assemble();
    }
}

Ausgabe:

Code
Basic Car. Adding features of Sports Car.
*****
Basic Car. Adding features of Luxury Car. Adding features of Sports Car.

Wie Sie sehen können, kann das Client-Programm verschiedene Autoobjekte zur Laufzeit erstellen und sogar die Reihenfolge der hinzugefügten Funktionen angeben.

Wichtige Vorteile des Decorator Patterns

  • Runtime Flexibilität: Der größte Vorteil des Decorator Patterns ist seine Fähigkeit, das Verhalten von Objekten zur Laufzeit zu modifizieren, was im Vergleich zu Vererbungsdesigns eine unvergleichliche Flexibilität bietet.
  • Wartung & Erweiterbarkeit: Das Hinzufügen oder Modifizieren von Verhalten wird einfacher, da Dekoratoren in verschiedenen Kombinationen zusammengestellt werden können, was das System skalierbarer macht.

Nachteile

  • Erhöhte Komplexität: Da jede Funktion ihren eigenen Dekorator erfordert, kann die Anzahl der Dekorator-Klassen zunehmen, was das Management erschwert, wenn zahlreiche Funktionen hinzugefügt werden müssen.

Häufige Anwendungsfälle

Im Java-Bereich wird das Decorator Pattern häufig in den I/O-Klassen wie FileReader, BufferedReader und anderen verwendet, wo zur Laufzeit zusätzliche Funktionen zu Lesern und Schreibern hinzugefügt werden.

Jetzt 200 € Guthaben sichern

Testen Sie Ihr Setup auf ccloud³

Registrieren Sie sich in der ccloud³ und erhalten Sie 200 € Startguthaben für Ihr Projekt – z. B. für eine PostgreSQL-VM mit automatischen Backups.

centron Redaktion Technische Redaktion

Das Redaktionsteam von centron schreibt Anleitungen aus dem Betriebsalltag: getestet auf unserer eigenen Plattform, betrieben im Rechenzentrum in Hallstadt bei Bamberg.

Kategorie JavaScript
Teilen
Noch offene Fragen?

Our team will help you with your specific setup - in German or English, by people who run the platform themselves.

War dieses Tutorial hilfreich?

Your answer is stored anonymously and helps us improve our tutorials.

Kommentare

No comments yet - be the first to ask a question about this tutorial.

Sign in to comment

Comments are open to centron customers. Sign in to your account to ask a question about this tutorial.

Weiterlesen

Das könnte Sie auch interessieren

Jetzt kostenlos anfangen

Melden Sie sich an und erhalten Sie in den ersten 60 Tagen ein Guthaben von 200 € bei centron.

Dieses Werbeangebot gilt nur für neue Konten. Angebot ausschließlich für Gewerbetreibende.

Jetzt loslegen Sales kontaktieren