Schablonenmethodenmuster
Teil des Abschnitts Objektorientierte Programmierung der Python-Journey von Coddy. Lektion 52 von 64.
Das Template-Method-Muster definiert das Grundgerüst eines Algorithmus in einer Basisklasse und ermöglicht es Unterklassen, bestimmte Schritte zu überschreiben, ohne die Struktur des Algorithmus zu ändern.
Hier ist eine Basisklasse mit einer Template-Methode:
class DataProcessor:
def process(self):
"""Schablonenmethode, die die Struktur des Algorithmus definiert"""
self.read_data()
self.process_data()
self.save_data()
def read_data(self):
print("Reading data...")
def process_data(self):
raise NotImplementedError("Subclasses must implement this")
def save_data(self):
print("Saving data...")Die Template-Methode process() definiert die Algorith musschritte, während process_data() den Unterklassen zur Implementierung überlassen wird.
Erstelle konkrete Klassen, die die abstrakte Methode implementieren:
class CSVProcessor(DataProcessor):
def process_data(self):
print("Processing CSV data")
class JSONProcessor(DataProcessor):
def process_data(self):
print("Processing JSON data")Jede konkrete Klasse stellt ihre eigene Implementierung des erforderlichen Schritts bereit.
Verwende die Template-Methode:
csv_processor = CSVProcessor()
csv_processor.process()
print() # Leere Zeile
json_processor = JSONProcessor()
json_processor.process()Erstelle ein weiteres Beispiel mit einer Spielvorlage:
class Game:
def play(self):
"""Schablonenmethode zum Spielen eines Spiels"""
self.start_game()
self.play_game()
self.end_game()
def start_game(self):
print("Game started!")
def play_game(self):
raise NotImplementedError("Define the game rules")
def end_game(self):
print("Game ended!")
class Chess(Game):
def play_game(self):
print("Playing chess - thinking strategically...")
class Soccer(Game):
def play_game(self):
print("Playing soccer - running and kicking...")
chess = Chess()
chess.play()Ausgabe:
Reading data...
Processing CSV data
Saving data...
Reading data...
Processing JSON data
Saving data...
Game started!
Playing chess - thinking strategically...
Game ended!Wichtiger Punkt: Das Template-Method-Muster definiert eine gemeinsame Algorithmusstruktur in der übergeordneten Klasse und ermöglicht es Unterklassen gleichzeitig, bestimmte Schritte anzupassen. Die übergeordnete Klasse steuert den Gesamtablauf, während Unterklassen die spezifischen Implementierungen bereitstellen. Dadurch wird eine konsistente Struktur gewährleistet und gleichzeitig Flexibilität bei den einzelnen Schritten ermöglicht.
Aufgabe
MittelImplementiere das Template-Method-Muster in template.py. Die abstrakte Klasse Report besitzt die Template-Methode generate(), die immer dieselben drei Schritte in derselben Reihenfolge ausführt: header(), body(), footer().
header()wird von jedem Bericht gemeinsam verwendet und gibt=== Report ===aus.body()ist abstrakt: Jede Unterklasse gibt ihren eigenen Inhalt aus.footer()ist ein Hook mit dem Standardwert=== End ===, den eine Unterklasse überschreiben kann.
Schreibe anschließend die beiden konkreten Berichte:
SalesReport(total)speichert die Summe inself._totalund gibt in seinem HauptteilTotal sales: {total}aus.InventoryReport(items)speichert die Liste inself._items, gibt für jedes Element in seinem HauptteilItem: {item}aus und überschreibt den Fußbereich, um=== {count} items ===auszugeben.
driver.py ist gesperrt: Es erstellt Berichte und ruft bei ihnen generate() auf. Nur die Schritte unterscheiden sich zwischen den Unterklassen; die Reihenfolge der Schritte ist einmalig in der Basisklasse festgelegt.
Probier es selbst
from template import SalesReport, InventoryReport
# Testfall-Handler (nicht ändern)
test_case = input()
if test_case == "sales_test":
SalesReport(1500).generate()
elif test_case == "inventory_test":
InventoryReport(["Laptop", "Mouse"]).generate()
elif test_case == "both_test":
for report in [SalesReport(200), InventoryReport(["Pen"])]:
report.generate()
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDer self-ParameterMethodenAttributeKonstruktormethode (__init__)Zusammenfassung – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDie super()-FunktionMethodenüberschreibungMehrfachvererbungMethodenauflösungsreihenfolgeWiederholung – Mitarbeiterhierarchie7Spezielle Methoden
Einführung in magische MethodenOperatorüberladungMagische Methoden für ContainerRückblick – Benutzerdefinierte Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster13Abschließende Herausforderungen
E-Learning-PlattformBankensystemEntwicklung von SpielfigurenFahrzeugvermietungsservice2Dekoratoren
Einführung in DekoratorenProperty-DekoratorDekorator für statische MethodenDekorator für Klassenmethoden5Polymorphie
Methodenüberschreibung erneut betrachtetDuck-TypingAbstrakte Klassen und MethodenSchnittstellendesignRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungMixinsStatische Methoden und KlassenmethodenKlassen-DekoratorenKontextmanager11Entwurfsmuster Teil 2
BefehlsmusterAdaptermusterDekorierermusterSchablonenmethodenmusterZustandsmusterKompositumsmuster3Klassenattribute
Instanz- vs. KlassenvariablenProperty-DecoratorsPrivate AttributeWiederholung – Bankkontoverwaltung6Kapselung
Öffentliche, geschützte, private MemberZugriffsmodifikatorenInformationsverbergungProperty-Decorators – FortgeschrittenWiederholung – System zur Verwaltung von Studentendaten12Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und BenutzerklassenAusleihsystemSuchfunktionAdministrationsoberflächeTests und IntegrationÜbe selbstständig: Online-Python-Compiler