SlideShare a Scribd company logo
1 of 22
Download to read offline
Template Method
                                        AbstractClass                   Client
                                     + templateMethod()
                                     - concreteOperation()
                                     # primitiveOperation()
                                     # hookOperation()




                         ConcreteClass1             ConcreteClass2
                                                   + primitiveOperation()
                        + primitiveOperation()
                                                   + hookOperation()
                        + hookOperation()




Ing. Nelson Firmani
Teramo 04/04/2013
Design Pattern secondo l'architetto Christopher Alexander


                           Opera in un contesto
                           particolare                             Insieme di forze in gioco in tale
  Design pattern                                       Contesto    contesto (obiettivi e vincoli
                                                                   spesso contrastanti che influenzano
                                                                   la parte del progetto che il pattern
                                                                    deve affrontare)
  Descrive un problema
  progettuale ricorrente

                                                                                   Forze



                                                                   Forma o regole da applicare per
    Problema                                           Soluzione   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.
●   Motivazione: diversi problemi si risolvono con algoritmi che hanno la stessa
    Motivazione
    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:
                                                        AbstractClass
              AbstractClass                        + templateMethod()

          + templateMethod()                       - concreteOperation()

          - concreteOperation()                    # primitiveOperation()

          # primitiveOperation()                   # hookOperation()

          # hookOperation()




              ConcreteClass            ConcreteClass1                  ConcreteClass2


           + primitiveOperation()   + primitiveOperation()         + primitiveOperation()

           + hookOperation()        + hookOperation()              + 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;
Il pattern Template Method
                                                                               Metodo template
                                                                    per implementare le parti non variabili
●   Codice sorgente di esempio:                                            e lasciare alle sottoclassi
                                                                                la responsabilità
                                                                      di implementare i comportamenti
    –   Es1: Classe astratta Spumante                                         che possono variare

        Spumante.java

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

        public abstract class Spumante {
             // template method
             public final void produzioneSpumante() {
                                                                   Metodo hook (di gancio)
                  preparazioneVinoBase();                       che può essere implementato
                  ulterioreFase();                                    nelle sottoclassi.
                  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 implementato
             protected void ulterioreFase(){    }
             //metodo primitivo che deve essere implementato nelle sottoclassi
             protected abstract void processoDiSpumantizzazione();
             //metodo primitivo che deve essere implementato nelle sottoclassi
             protected abstract void imbottigliamento();
                                                                               Metodi primipivi
        }                                                            che devono essere implementati
                                                                       (a differenza dei metodi hook
                                                                    che possono essere implementati
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 {

             @Override
             public 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.");
             }

             @Override
             public 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.");
             }

        }
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 {

             @Override
             public void ulterioreFase() {
                  System.out.println("operazioni di taglio, chiarificazione,
        refrigerazione e filtrazione");
             }

             @Override
             public void processoDiSpumantizzazione() {
                  System.out.println("Il processo di rifermentazione avviene in grandi
        contenitori, autoclavi. Tempo di spumantizzazione è breve (pochi mesi)");
             }

             @Override
             public void imbottigliamento() {
                  System.out.println("Messo in bottiglia in modo isobarico, ovvero
        senza perdita di pressione, pronto per la commercializzazione.");
             }

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

            }

        }
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 moscato
        Le uve devono provenire da zone DOC...la raccolta delle uve deve ...la pigiatura deve ...
        operazioni di taglio, chiarificazione, refrigerazione e filtrazione
        Il 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 brut
        Le 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.
Il pattern Template Method

●   Codice sorgente di esempio:
    –   Es2: classe astratta
        Array.java                                                             Metodo primipivo
                                                                       che deve essere implementato
        package it.tinn.nelson.designpattern.templatemethod.ex2;
                                                                        (a differenza dei metodi hook
        public abstract class Array {                                che possono essere implementati
          protected int [] a;

            //metodo primitivo che deve essere implementato
            //nelle sottoclassi
            protected abstract int compare(int i, int j);
                                                                          Metodo template
            //metodo template
            final public void sort() {                         per implementare le parti non variabili
              // ordinamento bubble sort o(n^2)                       e lasciare alle sottoclassi
              for (int i = a.length -1;i >= 0;--i ) {                      la responsabilità
                for (int j = 0;j < i; ++j ) {                    di implementare i comportamenti
                  if ( compare(a[j], a[j+1]) > 0 ) {                     che possono variare
                    int tmp = a[j];
                    a[j]    = a[j+1];
                    a[j+1] = tmp;
                  }
                }
              }
            }
        }
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;
            }
        }
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;
            }
        }
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]+" ");
                 }
            }
        }
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
Il pattern Template Method

●   Codice sorgente di esempio:

    Esempi di altri autori:

    http://shishirkumarblog.wordpress.com/designpattern/template-pattern/
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.
Il pattern Template Method


...




                   Author:      Ing. Nelson Firmani (nfirmani@gmail.com)
                   Last updated: 04/04/2013

More Related Content

What's hot

Lezione 9: Design Pattern Comportamentali
Lezione 9: Design Pattern ComportamentaliLezione 9: Design Pattern Comportamentali
Lezione 9: Design Pattern ComportamentaliAndrea Della Corte
 
Lezione 8: Design Pattern Comportamentali
Lezione 8: Design Pattern ComportamentaliLezione 8: Design Pattern Comportamentali
Lezione 8: Design Pattern ComportamentaliAndrea Della Corte
 
Lezione 4: I tool Ant e Subversion
Lezione 4: I tool Ant e SubversionLezione 4: I tool Ant e Subversion
Lezione 4: I tool Ant e SubversionAndrea Della Corte
 
Lezione design patterns 2011 (Peron)
Lezione design patterns 2011 (Peron)Lezione design patterns 2011 (Peron)
Lezione design patterns 2011 (Peron)lukebonham
 
Tdd.Every.Where.21012012
Tdd.Every.Where.21012012Tdd.Every.Where.21012012
Tdd.Every.Where.21012012LEGALDESK
 
Java Unit Testing - JUnit (2)
Java Unit Testing - JUnit (2)Java Unit Testing - JUnit (2)
Java Unit Testing - JUnit (2)fgianneschi
 
Java Unit Testing - JUnit (1)
Java Unit Testing - JUnit (1)Java Unit Testing - JUnit (1)
Java Unit Testing - JUnit (1)fgianneschi
 
Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Configurazione automatica di ambienti di testing per reti di calcolatori - te...Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Configurazione automatica di ambienti di testing per reti di calcolatori - te...Bruno Interlandi
 
C# e la Framework Class Library
C# e la Framework Class LibraryC# e la Framework Class Library
C# e la Framework Class LibraryManuel Scapolan
 

What's hot (16)

Lezione 9: Design Pattern Comportamentali
Lezione 9: Design Pattern ComportamentaliLezione 9: Design Pattern Comportamentali
Lezione 9: Design Pattern Comportamentali
 
Lezione 8: Design Pattern Comportamentali
Lezione 8: Design Pattern ComportamentaliLezione 8: Design Pattern Comportamentali
Lezione 8: Design Pattern Comportamentali
 
Design Pattern
Design PatternDesign Pattern
Design Pattern
 
Corso Java
Corso JavaCorso Java
Corso Java
 
Lezione 4: I tool Ant e Subversion
Lezione 4: I tool Ant e SubversionLezione 4: I tool Ant e Subversion
Lezione 4: I tool Ant e Subversion
 
Lezione design patterns 2011 (Peron)
Lezione design patterns 2011 (Peron)Lezione design patterns 2011 (Peron)
Lezione design patterns 2011 (Peron)
 
C# Language Evolution
C# Language EvolutionC# Language Evolution
C# Language Evolution
 
Java OCA teoria 4
Java OCA teoria 4Java OCA teoria 4
Java OCA teoria 4
 
Java OCA teoria 1
Java OCA teoria 1Java OCA teoria 1
Java OCA teoria 1
 
pattern
patternpattern
pattern
 
Tdd.Every.Where.21012012
Tdd.Every.Where.21012012Tdd.Every.Where.21012012
Tdd.Every.Where.21012012
 
Java Unit Testing - JUnit (2)
Java Unit Testing - JUnit (2)Java Unit Testing - JUnit (2)
Java Unit Testing - JUnit (2)
 
Java Unit Testing - JUnit (1)
Java Unit Testing - JUnit (1)Java Unit Testing - JUnit (1)
Java Unit Testing - JUnit (1)
 
Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Configurazione automatica di ambienti di testing per reti di calcolatori - te...Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Configurazione automatica di ambienti di testing per reti di calcolatori - te...
 
C# e la Framework Class Library
C# e la Framework Class LibraryC# e la Framework Class Library
C# e la Framework Class Library
 
Corso Java 1 - BASE
Corso Java 1 - BASECorso Java 1 - BASE
Corso Java 1 - BASE
 

Viewers also liked

REALIZZAZIONE DEL PROGETTO AMBULATORIO VETERINARIO ON-LINE
REALIZZAZIONE DEL PROGETTO AMBULATORIO VETERINARIO ON-LINEREALIZZAZIONE DEL PROGETTO AMBULATORIO VETERINARIO ON-LINE
REALIZZAZIONE DEL PROGETTO AMBULATORIO VETERINARIO ON-LINENelson Firmani
 
REALIZZAZIONE DEL PROGETTO CINEMA ON-LINE CineWeb
REALIZZAZIONE DEL PROGETTO CINEMA ON-LINE CineWebREALIZZAZIONE DEL PROGETTO CINEMA ON-LINE CineWeb
REALIZZAZIONE DEL PROGETTO CINEMA ON-LINE CineWebNelson Firmani
 
La gestione degli eventi e tecniche implementative
La gestione degli eventi e tecniche implementativeLa gestione degli eventi e tecniche implementative
La gestione degli eventi e tecniche implementativeNelson Firmani
 
documento sistema informativo ambulatorio veterinario on-line
documento sistema informativo ambulatorio veterinario on-linedocumento sistema informativo ambulatorio veterinario on-line
documento sistema informativo ambulatorio veterinario on-lineNelson Firmani
 
Progettazione di un convertitore analogico digitale in architettura multistadio
Progettazione di un convertitore analogico digitale in architettura multistadioProgettazione di un convertitore analogico digitale in architettura multistadio
Progettazione di un convertitore analogico digitale in architettura multistadioNelson Firmani
 
Modelli di linee di trasmissione nelson firmani
Modelli di linee di trasmissione   nelson firmaniModelli di linee di trasmissione   nelson firmani
Modelli di linee di trasmissione nelson firmaniNelson Firmani
 

Viewers also liked (8)

REALIZZAZIONE DEL PROGETTO AMBULATORIO VETERINARIO ON-LINE
REALIZZAZIONE DEL PROGETTO AMBULATORIO VETERINARIO ON-LINEREALIZZAZIONE DEL PROGETTO AMBULATORIO VETERINARIO ON-LINE
REALIZZAZIONE DEL PROGETTO AMBULATORIO VETERINARIO ON-LINE
 
Web services
Web servicesWeb services
Web services
 
REALIZZAZIONE DEL PROGETTO CINEMA ON-LINE CineWeb
REALIZZAZIONE DEL PROGETTO CINEMA ON-LINE CineWebREALIZZAZIONE DEL PROGETTO CINEMA ON-LINE CineWeb
REALIZZAZIONE DEL PROGETTO CINEMA ON-LINE CineWeb
 
La gestione degli eventi e tecniche implementative
La gestione degli eventi e tecniche implementativeLa gestione degli eventi e tecniche implementative
La gestione degli eventi e tecniche implementative
 
Cloud computing
Cloud computingCloud computing
Cloud computing
 
documento sistema informativo ambulatorio veterinario on-line
documento sistema informativo ambulatorio veterinario on-linedocumento sistema informativo ambulatorio veterinario on-line
documento sistema informativo ambulatorio veterinario on-line
 
Progettazione di un convertitore analogico digitale in architettura multistadio
Progettazione di un convertitore analogico digitale in architettura multistadioProgettazione di un convertitore analogico digitale in architettura multistadio
Progettazione di un convertitore analogico digitale in architettura multistadio
 
Modelli di linee di trasmissione nelson firmani
Modelli di linee di trasmissione   nelson firmaniModelli di linee di trasmissione   nelson firmani
Modelli di linee di trasmissione nelson firmani
 

Similar to Design pattern template method

Corso introduttivo di Design Pattern in Java per Elis - 1
Corso introduttivo di Design Pattern in Java per Elis - 1Corso introduttivo di Design Pattern in Java per Elis - 1
Corso introduttivo di Design Pattern in Java per Elis - 1Antonio Musarra
 
Baby Steps TripServiceKata
Baby Steps TripServiceKataBaby Steps TripServiceKata
Baby Steps TripServiceKataAndrea Francia
 
PowerMock TDD User Group Milano
PowerMock TDD User Group MilanoPowerMock TDD User Group Milano
PowerMock TDD User Group MilanoMassimo Groppelli
 
Lezione 01 - Singleton
Lezione 01 - SingletonLezione 01 - Singleton
Lezione 01 - SingletonMarco Bianchi
 
Introduzione a TypeScript
Introduzione a TypeScriptIntroduzione a TypeScript
Introduzione a TypeScriptSinergia Totale
 
Javaday 2006: Java 5
Javaday 2006: Java 5Javaday 2006: Java 5
Javaday 2006: Java 5Matteo Baccan
 
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
Programmazione a oggetti tramite la macchina del caffé (pt. 3)Programmazione a oggetti tramite la macchina del caffé (pt. 3)
Programmazione a oggetti tramite la macchina del caffé (pt. 3)Marcello Missiroli
 
Real Spring Aop Recipes For Your Everyday Job
Real Spring Aop Recipes For Your Everyday JobReal Spring Aop Recipes For Your Everyday Job
Real Spring Aop Recipes For Your Everyday JobMassimiliano Dessì
 
Introduzione al Test Driven Development
Introduzione al Test Driven DevelopmentIntroduzione al Test Driven Development
Introduzione al Test Driven DevelopmentEnnio Masi
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptSinergia Totale
 
Design patterns - parte 1
Design patterns - parte 1Design patterns - parte 1
Design patterns - parte 1Fabio Armani
 
Riuso Object Oriented
Riuso Object OrientedRiuso Object Oriented
Riuso Object OrientedStefano Fago
 
Lezione 13 - Strategy
Lezione 13 - StrategyLezione 13 - Strategy
Lezione 13 - StrategyMarco Bianchi
 
Corso Object Oriented Analysis and Design
Corso Object Oriented Analysis and DesignCorso Object Oriented Analysis and Design
Corso Object Oriented Analysis and DesignK-Tech Formazione
 

Similar to Design pattern template method (20)

Corso introduttivo di Design Pattern in Java per Elis - 1
Corso introduttivo di Design Pattern in Java per Elis - 1Corso introduttivo di Design Pattern in Java per Elis - 1
Corso introduttivo di Design Pattern in Java per Elis - 1
 
Baby Steps TripServiceKata
Baby Steps TripServiceKataBaby Steps TripServiceKata
Baby Steps TripServiceKata
 
PowerMock TDD User Group Milano
PowerMock TDD User Group MilanoPowerMock TDD User Group Milano
PowerMock TDD User Group Milano
 
Lezione 01 - Singleton
Lezione 01 - SingletonLezione 01 - Singleton
Lezione 01 - Singleton
 
Dal C a Java (1/3)
Dal C a Java (1/3)Dal C a Java (1/3)
Dal C a Java (1/3)
 
Introduzione a TypeScript
Introduzione a TypeScriptIntroduzione a TypeScript
Introduzione a TypeScript
 
Spring @Aspect e @Controller
Spring @Aspect e @Controller Spring @Aspect e @Controller
Spring @Aspect e @Controller
 
Javaday 2006: Java 5
Javaday 2006: Java 5Javaday 2006: Java 5
Javaday 2006: Java 5
 
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
Programmazione a oggetti tramite la macchina del caffé (pt. 3)Programmazione a oggetti tramite la macchina del caffé (pt. 3)
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
 
Java codestyle & tipstricks
Java codestyle & tipstricksJava codestyle & tipstricks
Java codestyle & tipstricks
 
Real Spring Aop Recipes For Your Everyday Job
Real Spring Aop Recipes For Your Everyday JobReal Spring Aop Recipes For Your Everyday Job
Real Spring Aop Recipes For Your Everyday Job
 
Introduzione al Test Driven Development
Introduzione al Test Driven DevelopmentIntroduzione al Test Driven Development
Introduzione al Test Driven Development
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScript
 
Design patterns - parte 1
Design patterns - parte 1Design patterns - parte 1
Design patterns - parte 1
 
Riuso Object Oriented
Riuso Object OrientedRiuso Object Oriented
Riuso Object Oriented
 
Lezione 13 - Strategy
Lezione 13 - StrategyLezione 13 - Strategy
Lezione 13 - Strategy
 
Corso Object Oriented Analysis and Design
Corso Object Oriented Analysis and DesignCorso Object Oriented Analysis and Design
Corso Object Oriented Analysis and Design
 
OOP with C#
OOP with C#OOP with C#
OOP with C#
 
Unit Testing
Unit TestingUnit Testing
Unit Testing
 
Testing
TestingTesting
Testing
 

Design pattern template method

  • 1. Template Method AbstractClass Client + templateMethod() - concreteOperation() # primitiveOperation() # hookOperation() ConcreteClass1 ConcreteClass2 + primitiveOperation() + primitiveOperation() + hookOperation() + hookOperation() Ing. Nelson Firmani Teramo 04/04/2013
  • 2. Design Pattern secondo l'architetto Christopher Alexander Opera in un contesto particolare Insieme di forze in gioco in tale Design pattern Contesto contesto (obiettivi e vincoli spesso contrastanti che influenzano la parte del progetto che il pattern deve affrontare) Descrive un problema progettuale ricorrente Forze Forma o regole da applicare per Problema Soluzione risolvere tali forze Descrive come le classi e gli oggetti del pattern risolvono il problema
  • 3. 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);
  • 4. 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;
  • 5. 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. ● Motivazione: diversi problemi si risolvono con algoritmi che hanno la stessa Motivazione 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
  • 6. Il pattern Template Method ● Struttura: AbstractClass AbstractClass + templateMethod() + templateMethod() - concreteOperation() - concreteOperation() # primitiveOperation() # primitiveOperation() # hookOperation() # hookOperation() ConcreteClass ConcreteClass1 ConcreteClass2 + primitiveOperation() + primitiveOperation() + primitiveOperation() + hookOperation() + hookOperation() + hookOperation()
  • 7. 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.
  • 8. 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
  • 9. 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;
  • 10. Il pattern Template Method Metodo template per implementare le parti non variabili ● Codice sorgente di esempio: e lasciare alle sottoclassi la responsabilità di implementare i comportamenti – Es1: Classe astratta Spumante che possono variare Spumante.java package it.tinn.nelson.designpattern.templatemethod.ex1; public abstract class Spumante { // template method public final void produzioneSpumante() { Metodo hook (di gancio) preparazioneVinoBase(); che può essere implementato ulterioreFase(); nelle sottoclassi. 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 implementato protected void ulterioreFase(){ } //metodo primitivo che deve essere implementato nelle sottoclassi protected abstract void processoDiSpumantizzazione(); //metodo primitivo che deve essere implementato nelle sottoclassi protected abstract void imbottigliamento(); Metodi primipivi } che devono essere implementati (a differenza dei metodi hook che possono essere implementati
  • 11. 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 { @Override public 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."); } @Override public 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."); } }
  • 12. 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 { @Override public void ulterioreFase() { System.out.println("operazioni di taglio, chiarificazione, refrigerazione e filtrazione"); } @Override public void processoDiSpumantizzazione() { System.out.println("Il processo di rifermentazione avviene in grandi contenitori, autoclavi. Tempo di spumantizzazione è breve (pochi mesi)"); } @Override public void imbottigliamento() { System.out.println("Messo in bottiglia in modo isobarico, ovvero senza perdita di pressione, pronto per la commercializzazione."); } }
  • 13. 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(); } }
  • 14. 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 moscato Le uve devono provenire da zone DOC...la raccolta delle uve deve ...la pigiatura deve ... operazioni di taglio, chiarificazione, refrigerazione e filtrazione Il 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 brut Le 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.
  • 15. Il pattern Template Method ● Codice sorgente di esempio: – Es2: classe astratta Array.java Metodo primipivo che deve essere implementato package it.tinn.nelson.designpattern.templatemethod.ex2; (a differenza dei metodi hook public abstract class Array { che possono essere implementati protected int [] a; //metodo primitivo che deve essere implementato //nelle sottoclassi protected abstract int compare(int i, int j); Metodo template //metodo template final public void sort() { per implementare le parti non variabili // ordinamento bubble sort o(n^2) e lasciare alle sottoclassi for (int i = a.length -1;i >= 0;--i ) { la responsabilità for (int j = 0;j < i; ++j ) { di implementare i comportamenti if ( compare(a[j], a[j+1]) > 0 ) { che possono variare int tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; } } } } }
  • 16. 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; } }
  • 17. 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; } }
  • 18. 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]+" "); } } }
  • 19. 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
  • 20. Il pattern Template Method ● Codice sorgente di esempio: Esempi di altri autori: http://shishirkumarblog.wordpress.com/designpattern/template-pattern/
  • 21. 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.
  • 22. Il pattern Template Method ... Author: Ing. Nelson Firmani (nfirmani@gmail.com) Last updated: 04/04/2013