Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Średni

Zaimplementuj 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ść w self._total i wyświetla Total sales: {total} w swojej treści.
  • InventoryReport(items) przechowuje listę w self._items, wyświetla Item: {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()
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Python online