Design patterns: Template Method
Il Template Method è un pattern comportamentale che definisce la struttura di un algoritmo all’interno di un metodo, lasciando ad alcune sottoclassi la possibilità di implementare parti specifiche dell’algoritmo senza modificarne la struttura globale. Questo pattern permette di riutilizzare il codice e favorire una chiara separazione tra ciò che è invariabile e ciò che è variabile all’interno dell’algoritmo.
Punti di Forza
- Riutilizzo del codice: La struttura generale dell’algoritmo viene definita una volta sola nella classe base, favorendo il riutilizzo del codice comune.
- Definizione flessibile degli algoritmi: Le sottoclassi possono modificare solo le parti specifiche dell’algoritmo, mantenendo invariata la sequenza generale.
- Prevenzione della duplicazione: Riduce la duplicazione del codice, perché la logica comune è collocata in un’unica classe base.
- Controllo del flusso dell’algoritmo: La classe base mantiene il controllo sull’esecuzione dell’algoritmo, rendendo difficile per le sottoclassi alterare l’ordine delle operazioni.
- Chiarezza strutturale: Permette una chiara suddivisione tra comportamento generico (classe base) e comportamento specifico (sottoclassi).
Caso d’uso: Procedura d’ordine online
Immagina di avere un sistema per gestire ordini online. Il processo di ordinazione segue delle fasi comuni: selezionare il prodotto, inserire i dettagli di spedizione e processare il pagamento. Tuttavia, il metodo di pagamento può variare tra carta di credito e PayPal.
Codice PHP
// Classe astratta che definisce il template method
abstract class OrderProcessTemplate {
// Template method che definisce l'algoritmo
public function processOrder() {
$this->selectProduct();
$this->addShippingDetails();
$this->processPayment();
$this->shipOrder();
}
// Metodi obbligatori da implementare nelle sottoclassi
abstract protected function selectProduct();
abstract protected function processPayment();
// Metodo comune per aggiungere i dettagli di spedizione
protected function addShippingDetails() {
echo "Aggiunti i dettagli di spedizione.\n";
}
// Metodo finale per spedire l'ordine, invariabile tra le sottoclassi
protected function shipOrder() {
echo "Ordine spedito.\n";
}
}
// Implementazione concreta per un ordine pagato con Carta di Credito
class CreditCardOrder extends OrderProcessTemplate {
protected function selectProduct() {
echo "Prodotto selezionato.\n";
}
protected function processPayment() {
echo "Pagamento effettuato con Carta di Credito.\n";
}
}
// Implementazione concreta per un ordine pagato con PayPal
class PayPalOrder extends OrderProcessTemplate {
protected function selectProduct() {
echo "Prodotto selezionato.\n";
}
protected function processPayment() {
echo "Pagamento effettuato con PayPal.\n";
}
}
// Esempio d'uso
$order1 = new CreditCardOrder();
$order1->processOrder(); // Processo di ordinazione con Carta di Credito
echo "\n";
$order2 = new PayPalOrder();
$order2->processOrder(); // Processo di ordinazione con PayPal
Spiegazione
- Classe OrderProcessTemplate: Definisce il Template Method processOrder(), che contiene la sequenza di operazioni comuni a tutte le sottoclassi. Alcuni metodi come selectProduct() e processPayment() sono definiti come astratti, lasciando alle sottoclassi il compito di implementarli.
- Metodi Invariabili: Metodi come addShippingDetails() e shipOrder() sono comuni a tutte le sottoclassi e non possono essere modificati.
- Sottoclassi (CreditCardOrder, PayPalOrder): Implementano i dettagli specifici dell’algoritmo, come la selezione del prodotto e il metodo di pagamento.
- Uso del Template Method: Il metodo processOrder() segue la sequenza predefinita, ma le parti variabili vengono delegate alle sottoclassi.
Conclusione
Il Template Method Pattern permette di definire la struttura di un algoritmo nella classe base e delegare alle sottoclassi l’implementazione dei dettagli specifici. Questo approccio rende il codice più modulare, riutilizzabile e facilmente estensibile.