Wzorzec Metoda szablonowa
Część sekcji Programowanie obiektowe ścieżki Python w Coddy. Lekcja 52 z 64.
Wzorzec Template Method definiuje szkielet algorytmu w klasie bazowej, umożliwiając podklasom nadpisywanie określonych kroków bez zmieniania struktury algorytmu.
Oto klasa bazowa z metodą szablonową:
class DataProcessor:
def process(self):
"""Metoda szablonowa definiująca strukturę algorytmu"""
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...")Metoda szablonowa process() określa kroki algorytmu, natomiast implementację process_data() pozostawia się podklasom.
Utwórz klasy konkretne implementujące metodę abstrakcyjną:
class CSVProcessor(DataProcessor):
def process_data(self):
print("Processing CSV data")
class JSONProcessor(DataProcessor):
def process_data(self):
print("Processing JSON data")Każda konkretna klasa zapewnia własną implementację wymaganego kroku.
Użyj metody szablonowej:
csv_processor = CSVProcessor()
csv_processor.process()
print() # Pusta linia
json_processor = JSONProcessor()
json_processor.process()Utwórz kolejny przykład z szablonem gry:
class Game:
def play(self):
"""Metoda szablonowa do rozgrywania gry"""
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()Wynik:
Reading data...
Processing CSV data
Saving data...
Reading data...
Processing JSON data
Saving data...
Game started!
Playing chess - thinking strategically...
Game ended!Kluczowa myśl: Wzorzec Metoda szablonowa definiuje wspólną strukturę algorytmu w klasie nadrzędnej, pozwalając jednocześnie podklasom dostosowywać poszczególne kroki. Klasa nadrzędna kontroluje ogólny przebieg, ale podklasy dostarczają konkretne implementacje. Zapewnia to spójną strukturę, a jednocześnie elastyczność w poszczególnych krokach.
Wyzwanie
ŚredniZaimplementuj wzorzec Template Method w pliku template.py. Abstrakcyjna klasa Report zawiera metodę szablonową generate(), która zawsze wykonuje te same trzy kroki w tej samej kolejności: header(), body(), footer().
header()jest wspólna dla każdego raportu i wyświetla=== Report ===.body()jest abstrakcyjna: każda podklasa wyświetla własną zawartość.footer()jest metodą hakową z domyślną implementacją=== End ===, którą podklasa może nadpisać.
Następnie napisz dwa konkretne raporty:
SalesReport(total)przechowuje łączną wartość wself._totali wyświetlaTotal sales: {total}w swojej treści.InventoryReport(items)przechowuje listę wself._items, wyświetlaItem: {item}dla każdego elementu w swojej treści i nadpisuje stopkę, aby wyświetlała=== {count} items ===.
Plik driver.py jest zablokowany: tworzy raporty i wywołuje na nich generate(). Między podklasami różnią się tylko kroki; kolejność kroków jest zdefiniowana raz w klasie bazowej.
Spróbuj swoich sił
from template import SalesReport, InventoryReport
# Obsługa przypadku testowego (nie zmieniać)
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()
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektyParametr selfMetodyAtrybutyMetoda konstruktora (__init__)Powtórzenie – prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaFunkcja super()Nadpisywanie metodDziedziczenie wielokrotneKolejność rozwiązywania metodPodsumowanie – hierarchia pracowników7Metody specjalne
Wprowadzenie do metod magicznychPrzeciążanie operatorówMagiczne metody kontenerówPowtórka – własna lista10Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy2Dekoratory
Wprowadzenie do dekoratorówDekorator propertyDekorator metody statycznejDekorator metody klasowej5Polimorfizm
Ponowne omówienie nadpisywania metodTypowanie kaczeKlasy i metody abstrakcyjneProjektowanie interfejsówPodsumowanie — kalkulator kształtów8Zaawansowane koncepcje programowania obiektowego
Kompozycja a dziedziczenieMiksyMetody statyczne i klasoweDekoratory klasMenedżery kontekstu11Wzorce projektowe, część 2
Wzorzec PolecenieWzorzec AdapterWzorzec DekoratorWzorzec Metoda szablonowaWzorzec StanWzorzec Kompozyt3Właściwości klas
Zmienne instancji a zmienne klasoweDekoratory właściwościAtrybuty prywatnePowtórzenie — menedżer kont bankowych6Hermetyzacja
Public, Protected, Private — pamięćModyfikatory dostępuUkrywanie informacjiDekoratory właściwości — zaawansowanePodsumowanie — system ewidencji uczniów12Projekt: System zarządzania biblioteką
Przegląd projektuKlasy Book i UserSystem wypożyczeńFunkcja wyszukiwaniaInterfejs administratoraTestowanie i integracjaPoćwicz samodzielnie: Kompilator Python online