Pattern metodo template
Fa parte della sezione Programmazione orientata agli oggetti del percorso Python di Coddy. Lezione 52 di 64.
Il Pattern Template Method definisce lo scheletro di un algoritmo in una classe base, consentendo alle sottoclassi di sovrascrivere passaggi specifici senza modificare la struttura dell’algoritmo.
Ecco una classe base con un metodo template:
class DataProcessor:
def process(self):
"""Metodo template che definisce la struttura dell'algoritmo"""
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...")Il metodo modello process() definisce i passaggi dell’algoritmo, mentre process_data() è lasciato alle sottoclassi da implementare.
Crea classi concrete che implementano il metodo astratto:
class CSVProcessor(DataProcessor):
def process_data(self):
print("Processing CSV data")
class JSONProcessor(DataProcessor):
def process_data(self):
print("Processing JSON data")Ogni classe concreta fornisce la propria implementazione del passaggio richiesto.
Usa il metodo template:
csv_processor = CSVProcessor()
csv_processor.process()
print() # Riga vuota
json_processor = JSONProcessor()
json_processor.process()Crea un altro esempio con un modello di gioco:
class Game:
def play(self):
"""Metodo template per giocare a un gioco"""
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()Output:
Reading data...
Processing CSV data
Saving data...
Reading data...
Processing JSON data
Saving data...
Game started!
Playing chess - thinking strategically...
Game ended!Punto chiave: il pattern Template Method definisce una struttura comune dell'algoritmo nella classe padre, lasciando alle sottoclassi la possibilità di personalizzare passaggi specifici. La classe padre controlla il flusso complessivo, mentre le sottoclassi forniscono le implementazioni specifiche. Questo assicura una struttura coerente, consentendo al contempo flessibilità nei singoli passaggi.
Sfida
MedioImplementa il pattern Template Method in template.py. La classe astratta Report possiede il metodo template generate(), che esegue sempre gli stessi tre passaggi nello stesso ordine: header(), body(), footer().
header()è condiviso da ogni report e stampa=== Report ===.body()è astratto: ogni sottoclasse stampa il proprio contenuto.footer()è un hook con un valore predefinito,=== End ===, che una sottoclasse può sovrascrivere.
Scrivi quindi i due report concreti:
SalesReport(total)memorizza il totale inself._totale stampaTotal sales: {total}nel proprio corpo.InventoryReport(items)memorizza la lista inself._items, stampaItem: {item}per ogni elemento nel proprio corpo e sovrascrive il footer per stampare=== {count} items ===.
driver.py è bloccato: crea i report e chiama generate() su di essi. Solo i passaggi differiscono tra le sottoclassi; l'ordine dei passaggi è definito una sola volta nella classe base.
Provalo tu
from template import SalesReport, InventoryReport
# Gestore dei casi di test (non modificare)
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()
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti di OOP
File esterniIntroduzione a OOPClassi vs. oggettiIl parametro selfMetodiAttributiMetodo costruttore (__init__)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa funzione super()Sovrascrittura dei metodiEreditarietà multiplaOrdine di risoluzione dei metodiRiepilogo - Gerarchia dei dipendenti7Metodi speciali
Introduzione ai metodi magiciSovraccarico degli operatoriMetodi magici dei contenitoriRiepilogo - Lista personalizzata10Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneModello SingletonModello FactoryModello ObserverModello Strategy2Decoratori
Introduzione ai decoratoriDecoratore di proprietàDecoratore di metodo staticoDecoratore di metodo di classe5Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàMixinMetodi statici e di classeDecorator di classeContext manager11Pattern di progettazione - Parte 2
Pattern dei comandiPattern adattatorePattern decoratorePattern metodo templatePattern statoPattern composito3Proprietà delle classi
Variabili di istanza e di classeDecorator delle proprietàAttributi privatiRiepilogo - Gestore di conti bancari6Incapsulamento
Membri pubblici, protetti e privatiModificatori di accessoOccultamento delle informazioniDecorator delle proprietà: avanzatiRipasso - Sistema di registri degli studenti12Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e UtenteSistema di prestitoFunzionalità di ricercaInterfaccia amministratoreTest e integrazioneEsercitati da solo: Compilatore Python online