![]() |
Il Chain of Responsibility è un design pattern comportamentale che consente a un oggetto di passare una richiesta lungo una catena di gestori. Ogni gestore può elaborare la richiesta o passarla al successivo nella catena. Questo pattern è utile per disaccoppiare mittenti e destinatari, rendendo il sistema più flessibile e scalabile.
Famiglia di Pattern: Pattern Comportamentali
Il pattern Chain of Responsibility appartiene alla famiglia dei Pattern Comportamentali. I pattern comportamentali si concentrano su come gli oggetti interagiscono e comunicano tra loro. Aiutano a definire come le responsabilità vengono distribuite tra le classi e come gli oggetti cooperano mantenendo un basso accoppiamento. Altri pattern di questa famiglia includono Observer, Strategy, Command e Template Method.
Diagramma
![]() |
Come Funziona il Pattern Chain of Responsibility
Il pattern Chain of Responsibility funziona creando una lista collegata di gestori, dove ogni gestore può elaborare una richiesta o passarla al successivo. Questo permette a più oggetti di elaborare una richiesta senza che il mittente debba sapere quale di essi la gestirà. Ciò consente anche di separare le logiche di implementazione creando disaccoppiamento e mantendo il codice più modulare e manutenibile.
Vediamo un esempio semplice in JavaScript per comprenderne meglio il funzionamento:
Come funziona:
Il primo gestore (
Validation1) verifica che il messaggio non sia vuoto prima di passarlo al gestore successivo.Il secondo gestore (
Validation2) controlla che il messaggio non contenga cifre; se è valido, lo inoltra.Il terzo gestore (
Validation3) verifica che il messaggio abbia una lunghezza minima prima di passarlo oltre.Questo approccio garantisce che ogni validazione venga applicata in sequenza e che la richiesta sia completamente validata solo se supera tutti i controlli.
Un esempio più concreto: Implementare un Wizard in JavaScript
Consideriamo ora un caso d'uso pratico per il pattern Chain of Responsibility: la gestione di un form multi-step o di un wizard. Questo pattern ci permette di gestire dinamicamente gli step del form modificando il nextHandler senza dover riscrivere l'intera logica di gestione degli step. Questa flessibilità facilita l'aggiunta, la rimozione o la riorganizzazione degli step, mantenendo il codice pulito e modulare.
Insert your personal data: inserimento dei dati personali di un utente
Upload your photo: caricamento di una foto
Confirm data: conferma dei dati inseriti
Outcome: esito dell'operazione
Ogni step sarà un gestore nella catena, elaborando la richiesta o passandola avanti.
Spiegazione
Ogni step estende la classe base
WizardStepe implementa il proprio metodohandle.Il metodo
setNext()viene utilizzato per creare dinamicamente e chiaramente la catena.La catena garantisce che gli step vengano eseguiti nell'ordine corretto, impedendo l'esecuzione di uno step se quello precedente non è stato completato.
Benefici dell'Uso del Pattern Chain of Responsibility
Disaccoppia i mittenti delle richieste dai destinatari, rendendo il codice più modulare.
Logica di gestione flessibile, consentendo di modificare gli step dinamicamente.
Maggiore manutenibilità, grazie all'isolamento della logica in classi separate.
Applicando il modello Chain of Responsibility, garantiamo che ogni passaggio della procedura guidata venga eseguito nell'ordine corretto, mantenendo al contempo una logica pulita e riutilizzabile.
Follow me #techelopment
Official site: www.techelopment.it
facebook: Techelopment
instagram: @techelopment
X: techelopment
Bluesky: @techelopment
telegram: @techelopment_channel
whatsapp: Techelopment
youtube: @techelopment

