Template Method Pattern

Template Method Pattern

Das Template Method Pattern ist ein Verhaltensmuster, das eine Vorlage für Algorithmen bereitstellt. Es definiert die Struktur eines Algorithmus, lässt jedoch bestimmte Schritte von den Unterklassen implementieren. Dadurch wird das Grundgerüst des Algorithmus in der Basisklasse festgelegt, während die Variation der Schritte in den abgeleiteten Klassen erfolgt.

Was ist das Template Method Pattern?

Das Template Method Pattern sorgt dafür, dass der grundlegende Ablauf eines Algorithmus nicht verändert wird. Stattdessen können abgeleitete Klassen bestimmte Schritte des Algorithmus überschreiben. Es besteht aus einer abstrakten Methode (der Template-Methode), die den allgemeinen Ablauf des Algorithmus definiert, und einer Reihe von abstrakten Methoden, die in den Unterklassen implementiert werden.

Komponenten des Template Method Patterns

  1. AbstractClass: Diese Klasse enthält die Template-Methode, die den Ablauf des Algorithmus festlegt. Sie kann auch einige gemeinsame Implementierungen enthalten.
  2. ConcreteClass: Die konkreten Klassen überschreiben die abstrakten Methoden, um die spezifische Implementierung der Schritte bereitzustellen.
  3. TemplateMethod: Diese Methode ist in der abstrakten Klasse definiert und ruft die abstrakten Methoden in einer bestimmten Reihenfolge auf. Sie ist der „Rahmen“ des Algorithmus.

Beispiel des Template Method Patterns in C++

Im folgenden Beispiel wird das Template Method Pattern verwendet, um den Ablauf einer einfachen Zubereitung von Getränken zu modellieren. Die Zubereitung jedes Getränks folgt einem ähnlichen Prozess, aber einige Schritte variieren.

#include <iostream>

// AbstractClass: Die abstrakte Klasse, die die Template-Methode enthält
class Drink {
public:
    // Template-Methode
    void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    // Abstrakte Methoden, die von den konkreten Klassen implementiert werden
    virtual void brew() = 0;
    virtual void addCondiments() = 0;

    // Gemeinsame Methoden, die in der Basis-Klasse definiert werden
    void boilWater() {
        std::cout << "Wasser wird gekocht." << std::endl;
    }

    void pourInCup() {
        std::cout << "Getränk wird in Tasse gegossen." << std::endl;
    }
};

// ConcreteClass: Eine konkrete Implementierung für Kaffee
class Coffee : public Drink {
public:
    void brew() override {
        std::cout << "Kaffee wird gebrüht." << std::endl;
    }

    void addCondiments() override {
        std::cout << "Kaffee wird mit Zucker und Milch verfeinert." << std::endl;
    }
};

// ConcreteClass: Eine konkrete Implementierung für Tee
class Tea : public Drink {
public:
    void brew() override {
        std::cout << "Tee wird gezogen." << std::endl;
    }

    void addCondiments() override {
        std::cout << "Tee wird mit Zitrone verfeinert." << std::endl;
    }
};

// Client-Code
int main() {
    Coffee coffee;
    Tea tea;

    std::cout << "Zubereitung Kaffee:" << std::endl;
    coffee.prepareRecipe();

    std::cout << "\nZubereitung Tee:" << std::endl;
    tea.prepareRecipe();

    return 0;
}

Erklärung des C++-Beispiels

  1. Drink (AbstractClass): Diese abstrakte Klasse stellt die Template-Methode prepareRecipe() bereit. Sie enthält auch die gemeinsamen Methoden boilWater() und pourInCup(), die unverändert bleiben. Die beiden abstrakten Methoden brew() und addCondiments() müssen von den konkreten Klassen überschrieben werden.
  2. Coffee und Tea (ConcreteClass): Diese beiden konkreten Klassen implementieren die abstrakten Methoden, um das spezifische Verhalten für Kaffee und Tee bereitzustellen. In Coffee wird der Kaffee gebrüht, während in Tea der Tee gezogen wird. Beide Klassen fügen ihre eigenen Zutaten hinzu.
  3. Client: Der Client ruft die Methode prepareRecipe() auf, um den gesamten Zubereitungsprozess zu starten. Die Template-Methode sorgt dafür, dass der Ablauf gleich bleibt, aber die spezifischen Schritte (wie brew und addCondiments) unterschiedlich sind.

Vorteile des Template Method Patterns

  1. Wiederverwendbarkeit: Das Grundgerüst des Algorithmus wird in der Basisklasse definiert. Dadurch können die Unterklassen nur die variablen Schritte überschreiben, ohne den gesamten Algorithmus neu zu schreiben.
  2. Vermeidung von Duplikaten: Gemeinsame Schritte werden in der Basisklasse implementiert. So wird der Code in den konkreten Klassen minimiert.
  3. Flexibilität: Das Template Method Pattern erlaubt es, den allgemeinen Ablauf des Algorithmus zu verändern, ohne die Struktur zu beeinflussen. Nur die spezifischen Schritte müssen angepasst werden.
  4. Einheitlichkeit: Das Muster sorgt für Konsistenz, da der Ablauf des Algorithmus für alle konkreten Klassen gleich bleibt. Nur die Implementierung der Schritte unterscheidet sich.

Nachteile des Template Method Patterns

  1. Schwierigkeit bei Änderungen: Wenn sich der allgemeine Ablauf des Algorithmus ändert, muss die Basisklasse angepasst werden. Dies kann Auswirkungen auf alle abgeleiteten Klassen haben.
  2. Vererbungshierarchie: Das Pattern erfordert eine Vererbungshierarchie. Dies kann den Code komplexer und weniger flexibel machen, wenn viele verschiedene Verhaltensweisen erforderlich sind.
  3. Schwierigkeit bei sehr komplexen Algorithmen: Wenn der Algorithmus viele variiertbare Teile hat, kann das Muster zu einer zu großen Anzahl von Methoden führen. Dies kann die Lesbarkeit und Wartbarkeit des Codes erschweren.

Fazit

Das Template Method Pattern ist ein nützliches Designmuster, um den Ablauf eines Algorithmus festzulegen, während bestimmte Schritte von Unterklassen implementiert werden können. Es hilft, Duplikate zu vermeiden und fördert die Wiederverwendbarkeit von Code. In unserem Beispiel zur Zubereitung von Getränken wird der allgemeine Ablauf in der abstrakten Klasse Drink definiert, während die konkreten Klassen wie Coffee und Tea nur die variablen Teile überschreiben. Dieses Muster eignet sich besonders, wenn der allgemeine Ablauf eines Prozesses konstant bleibt, aber einzelne Schritte anpassbar sein müssen.

Zur Pattern-Übersicht: Liste der Design-Pattern

VG WORT Pixel