22
Template Method Ing. Nelson Firmani Teramo 04/04/2013 ConcreteClass1 + primitiveOperation() + hookOperation() AbstractClass + templateMethod() - concreteOperation() # primitiveOperation() # hookOperation() ConcreteClass2 + primitiveOperation() + hookOperation() Client

Design pattern template method

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Design pattern template method

Template Method

Ing. Nelson FirmaniTeramo 04/04/2013

ConcreteClass1

+ primitiveOperation()+ hookOperation()

AbstractClass

+ templateMethod()- concreteOperation()# primitiveOperation()# hookOperation()

ConcreteClass2+ primitiveOperation()+ hookOperation()

Client

Page 2: Design pattern template method

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

Page 3: Design pattern template method

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);

Page 4: Design pattern template method

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;

Page 5: Design pattern template method

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

Page 6: Design pattern template method

Il pattern Template Method

● Struttura:

ConcreteClass1

+ primitiveOperation()

+ hookOperation()

AbstractClass

+ templateMethod()

- concreteOperation()

# primitiveOperation()

# hookOperation()

ConcreteClass2

+ primitiveOperation()

+ hookOperation()

ConcreteClass

+ primitiveOperation()

+ hookOperation()

AbstractClass

+ templateMethod()

- concreteOperation()

# primitiveOperation()

# hookOperation()

Page 7: Design pattern template method

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.

Page 8: Design pattern template method

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

Page 9: Design pattern template method

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;

Page 10: Design pattern template method

Il pattern Template Method

● Codice sorgente di esempio:

– Es1: Classe astratta Spumante

Spumante.java

package it.tinn.nelson.designpattern.templatemethod.ex1;

public abstract class Spumante {// template methodpublic final void produzioneSpumante() {

preparazioneVinoBase();ulterioreFase();processoDiSpumantizzazione();imbottigliamento();

}protected void preparazioneVinoBase(){

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

nelle sottoclassi.

Page 11: Design pattern template method

Il pattern Template Method

● Codice sorgente di esempio:

– Es1: Sottoclasse SpumanteChampenois

SpumanteChampenois.java

package it.tinn.nelson.designpattern.templatemethod.ex1;

public class SpumanteChampenois extends Spumante {

@Overridepublic void processoDiSpumantizzazione() {

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.");

}

}

Page 12: Design pattern template method

Il pattern Template Method

● Codice sorgente di esempio:

– Es1: Sottoclasse SpumanteCharmat

SpumanteCharmat.java

package it.tinn.nelson.designpattern.templatemethod.ex1;

public class SpumanteCharmat extends Spumante {

@Overridepublic void ulterioreFase() {

System.out.println("operazioni di taglio, chiarificazione, refrigerazione e filtrazione");

}

@Overridepublic void processoDiSpumantizzazione() {

System.out.println("Il processo di rifermentazione avviene in grandi contenitori, autoclavi. Tempo di spumantizzazione è breve (pochi mesi)");

}

@Overridepublic void imbottigliamento() {

System.out.println("Messo in bottiglia in modo isobarico, ovvero senza perdita di pressione, pronto per la commercializzazione.");

}

}

Page 13: Design pattern template method

Il pattern Template Method

● Codice sorgente di esempio:

– Es1: Classe client

Demo.java

package it.tinn.nelson.designpattern.templatemethod.ex1;

public class Demo {

public static void main(String[] args) {System.out.println("Un buon spumante moscato");Spumante moscato = new SpumanteCharmat();moscato.produzioneSpumante();

System.out.println();

System.out.println("Un buon spumante brut");Spumante brut = new SpumanteChampenois();brut.produzioneSpumante();

}

}

Page 14: Design pattern template method

Il pattern Template Method

● Codice sorgente di esempio:

– Es1: Esecuzione classe client

$JAVA_HOME/bin/java it.tinn.nelson.designpattern.templatemethod.ex1.Demo.java

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.

Page 15: Design pattern template method

Il pattern Template Method

● Codice sorgente di esempio:

– Es2: classe astratta

Array.java

package it.tinn.nelson.designpattern.templatemethod.ex2;

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

che possono essere implementati

Page 16: Design pattern template method

Il pattern Template Method

● Codice sorgente di esempio:

– Es2 - sottoclasse ordinamento ascendente

AscSortedArray.java

package it.tinn.nelson.designpattern.templatemethod.ex2;

public class AscSortedArray extends Array { protected int compare(int i, int j) { return ( i == j )? 0: ( i > j )? +1: -1; }}

Page 17: Design pattern template method

Il pattern Template Method

● Codice sorgente di esempio:

– Es2 - sottoclasse ordinamento discendente

DescSortedArray.java

package it.tinn.nelson.designpattern.templatemethod.ex2;

public class DescSortedArray extends Array { protected int compare(int i, int j) { return ( i == j )? 0: ( i < j )? +1: -1; }}

Page 18: Design pattern template method

Il pattern Template Method

● Codice sorgente di esempio:

– Es2: Classe client

Client.java

package it.tinn.nelson.designpattern.templatemethod.ex2;

public class Client {public static void main(String[] args) {

AscendingSortedArray asc = new AscendingSortedArray();DescendingSortedArray desc = new DescendingSortedArray();

desc.a = new int[]{4,2,5,3,1}; asc.a = new int[]{2,1,4,5,3};

asc.sort();desc.sort();

System.out.print("ordinamento ascendente:");for (int i = 0; i < asc.a.length; i++) {

System.out.print(asc.a[i]+" ");};System.out.println();System.out.print("ordinamento discendente:");for (int i = 0; i < desc.a.length; i++) {

System.out.print(desc.a[i]+" ");}

}}

Page 19: Design pattern template method

Il pattern Template Method

● Codice sorgente di esempio:

– Es2: Esecuzione classe client

$JAVA_HOME/bin/java it.tinn.nelson.designpattern.templatemethod.ex2.Client.java

ordinamento ascendente:1 2 3 4 5 ordinamento discendente:5 4 3 2 1

Page 20: Design pattern template method

Il pattern Template Method

● Codice sorgente di esempio:

Esempi di altri autori:

http://shishirkumarblog.wordpress.com/designpattern/template-pattern/

Page 21: Design pattern template method

Il pattern Template Method

● 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.

Page 22: Design pattern template method

Il pattern Template Method

...

Author: Ing. Nelson Firmani ([email protected])

Last updated: 04/04/2013