This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Design Pattern secondo l'architetto Christopher Alexander
Design pattern Contesto
SoluzioneProblema
Forze
Descrive un problema progettuale ricorrente
Opera in un contestoparticolare Insieme di forze in gioco in tale
contesto (obiettivi e vincolispesso contrastanti che influenzanola parte del progetto che il pattern deve affrontare)
Forma o regole da applicare per risolvere tali forze
Descrive come le classi e gli oggetti del pattern risolvono il problema
Design Pattern secondo la GoF(Definizione dei design pattern in modo da facilitarne il riuso)
● Nome e classificazione: permette di identificare il design pattern;
● Intento: descrizione sul cosa fa il design pattern a quale problema di progettazione si rivolge quando funziona la soluzione;
● Sinonimi: eventuali altri nomi che identificano il pattern;
● Motivazione: descrizione del problema progettuale e come il pattern fornisce una soluzione;
● Applicabilità: contesti in cui si può applicare il pattern;
● Struttura: rappresentazione grafica tramite UML delle classi coinvolte;
– partecipanti: classi che partecipano al pattern, loro relazioni e responsabilità (class diagram, object ed activity diagram);
– collaborazioni: Come collaborano le varie classi per raggiungere gli obiettivi (sequence diagram);
Design Pattern secondo la GoF(Definizione dei design pattern in modo da facilitarne il riuso)
● Conseguenze: costi e benefici dell'uso del pattern;
● Implementazione: suggerimenti e tecniche;
● Codice sorgente di esempio: frammenti di codice che mostrano una possibile implementazione;
● Usi noti: pattern trovati in sistemi reali;
● Pattern correlati: differenze e relazioni con altri pattern;
Il pattern Template Method
● Nome: Template Method
● Classificazione: è un pattern comportamentale basato su classi (ereditarietà).
● Intento: definire un algoritmo (quindi la sequenza dei suoi passi), e delegare a delle sottoclassi il compito di specificare/ridefinire alcuni dei suoi passi senza cambiarne la struttura.
● Sinonimi: self-delegation.
● MotivazioneMotivazione: diversi problemi si risolvono con algoritmi che hanno la stessa struttura, ma differiscono in alcune operazioni di dettaglio. Ripetere più volte la struttura comune è una violazione del principio “Don't Repeat Yourself” (non ripeterti). La soluzione è quella di separare l'algoritmo dai dettagli di contesto.
● Applicabilità: in tutti i contesti in cui si desidera definire uno schema rigido delle operazioni da eseguire ma con la consapevolezza che alcune operazioni potranno essere implementati in più modi diversi
Il pattern Template Method
● Struttura:
ConcreteClass1
+ primitiveOperation()
+ hookOperation()
AbstractClass
+ templateMethod()
- concreteOperation()
# primitiveOperation()
# hookOperation()
ConcreteClass2
+ primitiveOperation()
+ hookOperation()
ConcreteClass
+ primitiveOperation()
+ hookOperation()
AbstractClass
+ templateMethod()
- concreteOperation()
# primitiveOperation()
# hookOperation()
Il pattern Template Method
● Struttura:
– Partecipanti:
● AbstractClass: è la superclasse che definisce lo scheletro dell'algoritmo attraverso il metodo concreto templateMethod(). TemplateMethod() invoca i metodi privati concreteOperation(), invoca i metodi primitivi astratti primitiveOperation() implementati nelle sottoclassi, e può invocare i metodi hookOperation() (metodi di gancio) che le sottoclassi possono specializzare o no in quanto rappresentano punti di estensione.
● ConcreteClass: un numero variabile di sottoclassi concrete che devono implementare i metodi primitivi primitiveOperation() per eseguire i passi specifici dell’algoritmo, e facoltativamente sovrascrivere i metodi hook
– Collaborazioni:è un pattern comportamentale basato sull'ereditarietà di classi che è una relazione statica, quindi la modellazione dinamica (diagrammi di sequenza) è poco rappresentativa.
Il pattern Template Method
● Conseguenza:
– Benefici:
● Centralizza ed evita la duplicazione del codice (principio “Don't Repeat Yourself”)
● Fattorizzazione delle responsabilità.
● Possibilità di aggiungere altre funzionalità attraverso i metodi “hook” (aggancio o uncino).
● Hollywood Principle: “Don’t call us...We’ll call you.” non è il codice della classe specifica a richiamare il codice della superclasse, ma il contrario la superclasse invoca la sottoclasse (inversione di controllo).
– Costi: nessuno
Il pattern Template Method
● Implementazione:
– I metodi primitivi dovrebbero essere membri protetti;
– Il template method non dovrebbe essere ridefinito quindi in Java il metodo va dichiarato “final”;
– Minimizzare il numero di metodi primitivi;
– Definire una naming convention per i nomi dei metodi di cui effettuare override;
System.out.println("Le uve devono provenire da zone DOC...la raccolta delle uve deve ...la pigiatura deve ...");
}//metodo hook può essere implementatoprotected void ulterioreFase(){ }//metodo primitivo che deve essere implementato nelle sottoclassiprotected abstract void processoDiSpumantizzazione();//metodo primitivo che deve essere implementato nelle sottoclassiprotected abstract void imbottigliamento();
}
Metodo template per implementare le parti non variabili
e lasciare alle sottoclassi la responsabilità
di implementare i comportamenti che possono variare
Metodi primipivi che devono essere implementati
(a differenza dei metodi hook che possono essere implementati
Metodo hook (di gancio)che può essere implementato
System.out.println("Il processo di rifermentazione avviene esclusivamente in bottiglia. Il tempo della fermentazione e più lungo, spesso vengono assemblate più annate.");
}
@Overridepublic void imbottigliamento() {
System.out.println("Imbottigliato col tappo a corona per effettuare poi la successiva stappatura per l’eliminazione del deposito formato dai lieviti nel collo della bottiglia.");
Un buon spumante moscatoLe uve devono provenire da zone DOC...la raccolta delle uve deve ...la pigiatura deve ...operazioni di taglio, chiarificazione, refrigerazione e filtrazioneIl processo di rifermentazione avviene in grandi contenitori, autoclavi. Tempo di spumantizzazione è breve (pochi mesi)Messo in bottiglia in modo isobarico, ovvero senza perdita di pressione, pronto per la commercializzazione.
Un buon spumante brutLe uve devono provenire da zone DOC...la raccolta delle uve deve ...la pigiatura deve ...Il processo di rifermentazione avviene esclusivamente in bottiglia. Il tempo della fermentazione e più lungo, spesso vengono assemblate più annate.Imbottigliato col tappo a corona per effettuare poi la successiva stappatura per l’eliminazione del deposito formato dai lieviti nel collo della bottiglia.
public abstract class Array { protected int [] a; //metodo primitivo che deve essere implementato //nelle sottoclassi protected abstract int compare(int i, int j); //metodo template final public void sort() { // ordinamento bubble sort o(n^2) for (int i = a.length -1;i >= 0;--i ) { for (int j = 0;j < i; ++j ) { if ( compare(a[j], a[j+1]) > 0 ) { int tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; } } } }}
Metodo template per implementare le parti non variabili
e lasciare alle sottoclassi la responsabilità
di implementare i comportamenti che possono variare
Metodo primipivo che deve essere implementato(a differenza dei metodi hook
● Usi noti: E' un pattern molto diffuso utilizzato praticamente da tutti i framework.I framework rappresentano la struttura di una applicazione customizzabile da uno sviluppatore e assumono il controllo della applicazione e non il contrario (principio di inversione di controllo). Uno dei pattern per realizzare l'inversione di controllo è il template method.
– Il framework Spring offre diverse possibilità per la persistenza dei dati mediante JDBC, la principale delle quali è l’utilizzo della classe JDBCTemplate. org.springframework.jdbc.core.JdbcTemplate questa classe implementa l’intero processo di accesso ai dati attraverso template methods, rendendo possibile la personalizzazione di tutte le fasi di tale processo mediante l’ovverride dei metodi specifici.
– Nel framework JUnit il metodo RunBare() della classe junit.framework.TestCase è un metodo template.
– L'utilizzo di questo pattern lo troviamo in diverse classi del Java Development Kit:
● esempio java.lang.Comparable prevede il metodo: int compareTo(Object o) con risultato positivo, negativo o nullo e il template metodo Collections.sort() assume che gli oggetti della collezione implementino compareTo();
● la classe javax.swing.SwingWorker ha come template method: public final void execute(), come metodo primitivo che deve essere implementato nelle sottoclassi: doInBackground() e come metodi che possono essere implementati (metodi hook) process(List), e done();
● la classe javax.servlet.http.HttpServlet ha come template method: public void service(), come metodi primitivi da sovrascrivere doGet, doPost, doHead, doPut, doDelete, doTrace, doOptions;
● le classi java.util.AbstractList, java.util.AbstractSet e java.util.AbstractMap.