Definition
Schablonenmethode
Ein Entwurfsmuster, bei dem in einer Oberklasse eine Methode definiert wird, die den Ablauf eines Algorithmus festlegt. Dabei sind einige wichtige Schritte des Algorithmus durch das Schlüsselwort final fixiert, können also von Unterkalssen nicht überschrieben werden. Andere Schritte des Algorithmus dagegen können oder müssen sogar (abstrakte Methoden) überschrieben werden.
Die Oberklasse gibt also die Schablone oder denRahmen des Algorithmus vor, die Unterklassen steuern die Details.
Beispiel
Betrachten wir dazu den folgenden Quelltext:
abstract class Getraenk { // Schablonenmethode: legt den Ablauf fest public final void bereiteZu() { kocheWasser(); fuegeHauptZutatHinzu(); fuegeZusaetzeHinzu(); serviere(); } private void kocheWasser() { System.out.println("Wasser wird gekocht."); } private void serviere() { System.out.println("Getränk wird serviert."); } // Diese Methode muss in einer Unterklasse definiert werden: protected abstract void fuegeHauptZutatHinzu(); // Diese Methode kann in einer Unterklasse überschrieben werden // muss aber nicht, wenn keine Zusätze hinhzugefügt werden sollen. protected void fuegeZusaetzeHinzu(); } class Tee extends Getraenk { @Override protected void fuegeHauptZutatHinzu() { System.out.println("Teebeutel wird ins Wasser gehängt."); } @Override protected void fuegeZusaetzeHinzu() { System.out.println("Zitrone wird hinzugefügt."); } } class Kaffee extends Getraenk { @Override protected void fuegeHauptZutatHinzu() { System.out.println("Kaffeepulver wird aufgebrüht."); } @Override protected void fuegeZusaetzeHinzu() { System.out.println("Milch und Zucker werden hinzugefügt."); } }
Die Methode bereiteZu() ist in diesem Beispiel die Schablonenmethode, sie legt den Ablauf einheitlich fest. Zunächst wird Wasser gekocht, dann wird die Hauptzutat des Getränks hinzugefügt, anschließend können weitere Zutaten hinzugefügt werden, und schließlich wird das Getränk serviert. Damit die Unterklassen diesen grundsätzlichen Ablauf nicht verändern können, ist die Methode als final deklariert worden (siehe auch "finale Methoden" in dieser Abteilung).
Die Methoden kocheWasser() und serviere() müssen bei jedem heißen Getränk durchgeführt werden, die Unterklassen sollen da nichts ändern. Daher wurden diese beiden Methoden in der Oberklasse als private deklariert. Alternativ hätte man sie auch als final kennzeichnen können.
Die Methode fuegeHauptZutatHinzu() ist dagegen als abstract deklariert, sie muss zwingend in den Unterklassen überschrieben werden. Wer will schon nur heißes Wasser ohne Hauptzutat trinken.
Die Methode fuegeZusaetzeHinzu() dagegen ist nicht als abstrakt deklariert, sie muss also nicht überschrieben werden. Wenn dem Heißgetränk jedoch Zusätze wie Milch oder Zucker hinzugefügt werden sollen, dann kann die Methode von der jeweiligen Unterklasse überschrieben werden.
Ein weiteres Beispiel für Schablonen-Methoden finden Sie in diesem Artikel.
Quellen:
- Lahres et al.: Objektorientierte Programmierung, Rheinwerk Computing 2021.