Template-Method-Muster
Kurz: Beim Template-Method-Muster legt eine Basisklasse den Ablauf eines Verfahrens fest und lässt einzelne Schritte von Unterklassen füllen. Der Rahmen bleibt gleich, die Details unterscheiden sich.
Beispiel
Eine Datei verarbeiten besteht immer aus: öffnen → lesen → auswerten → schließen. Nur das „auswerten“ unterscheidet sich je nach Dateityp.
class Verarbeiter:
def ausfuehren(self, pfad): # die "Schablone"
daten = self.lesen(pfad)
ergebnis = self.auswerten(daten) # Haken für Unterklassen
self.speichern(ergebnis)
def lesen(self, pfad):
with open(pfad) as f:
return f.read()
def auswerten(self, daten): # muss überschrieben werden
raise NotImplementedError
def speichern(self, ergebnis):
print(ergebnis)
class ZeilenZaehler(Verarbeiter):
def auswerten(self, daten):
return len(daten.splitlines())Wann sinnvoll?
- Mehrere Klassen teilen denselben Ablauf mit verschiedenen Einzelschritten.
- Man will verhindern, dass Unterklassen die Reihenfolge ändern.
Nachteile und Alternativen
Das Muster nutzt Vererbung, die Unterklassen sind stark an die Basisklasse gebunden. Oft ist Strategy-Muster flexibler: Statt zu erben, übergibt man den austauschbaren Schritt als Objekt oder Funktion (Higher-Order-Function). Auch Frameworks nutzen das Muster (Hooks wie setUp() in Testklassen).
Siehe auch: SOLID-Prinzipien