SlideShare a Scribd company logo
Design Pattern
CRS4 - http://www.crs4.it




                                Basic Tutorial


                                      aprile 2005




                                Davide Carboni - Stefano Sanna
                                  {dcarboni|gerda@crs4.it}
Agenda
                            ●   Programmazione OO Avanzata:
                                –   Reflection
CRS4 - http://www.crs4.it




                                –   Introduzione ai Design Pattern
                            ●   I pattern principali
                            ●   I pattern dell'API di Java
                            ●   Bibliografia
                            ●   Conclusioni



                                                 Davide Carboni - Stefano Sanna
                                                   {dcarboni|gerda@crs4.it}
Introduzione ai Design Pattern
CRS4 - http://www.crs4.it




                            Vogliamo progettare il primo piano della nostra villetta
                            disponendo 3 camere da letto e un bagno. Nessuna finestra
                            deve aprirsi a nord. Nessuna camera da letto deve essere
                            meno ampia di 9mq
                                              Davide Carboni - Stefano Sanna
                                                {dcarboni|gerda@crs4.it}
Introduzione ai Design Pattern
CRS4 - http://www.crs4.it




                                                                    scala
                                      L3



                                                                       L1
                                                          WC
                                       L2




                                           Davide Carboni - Stefano Sanna
                                             {dcarboni|gerda@crs4.it}
Introduzione ai Design Pattern
CRS4 - http://www.crs4.it




                                                                    scala
                                      L3



                                                                       L1
                                                          WC
                                       L2




                                           Davide Carboni - Stefano Sanna
                                             {dcarboni|gerda@crs4.it}
Introduzione ai Design Pattern


                            ●   Dato un problema, troviamo una soluzione
CRS4 - http://www.crs4.it




                            ●   Data una classe di problemi simili,
                                troviamo una classe di soluzioni simili

                            ●   Una classe di soluzioni rappresenta una
                                architettura generica detta “pattern”



                                             Davide Carboni - Stefano Sanna
                                               {dcarboni|gerda@crs4.it}
Reflection
                            ●   La riflessività è la capacità del codice di
                                eseguire una “computazione” su una
CRS4 - http://www.crs4.it




                                “computazione”
                            ●   In altre parole: dato un programma, questo
                                è riflessivo se è in grado di estrarre
                                informazioni sulla sua struttura
                            ●   La riflessività può essere anche “attiva” se
                                il programma può anche cambiare la sua
                                struttura oltre che “capirla”


                                             Davide Carboni - Stefano Sanna
                                               {dcarboni|gerda@crs4.it}
Reflection: esempio
                            Frame f=new Frame("Pippo");

                            f.setVisible(true);                ... è equivalente a:
CRS4 - http://www.crs4.it




                            Class myclass = Class.forName("java.awt.Frame");
                            Constructor constructor =
                              myclass.getConstructor(new Class[]
                              {String.class});
                            Object o = constructor.newInstance(new Object[]
                              {"Pippo Riflessivo"});
                            Method m2 = myclass.getMethod("setVisible",new
                              Class[]{Boolean.TYPE});
                            m2.invoke(o,new Object[]{new Boolean(true)});
                                            Davide Carboni - Stefano Sanna
                                              {dcarboni|gerda@crs4.it}
Reflection: classi e metaclassi
                                                                           Class
                                                                    methods=[invoke(), getMethod()]
                                                                    fields=[methods, fields, ...]
CRS4 - http://www.crs4.it




                                                Is instance of
                             Point
                             methods=[f( ), g( ), h( )]
                             fields=[X, Y]                                     Is instance of


                                          Is instance of
                                 aPoint

                                     X=45, Y=25


                                                    Davide Carboni - Stefano Sanna
                                                      {dcarboni|gerda@crs4.it}
Reflection API
                            ●   Vedere documentazione SDK
CRS4 - http://www.crs4.it




                                          Davide Carboni - Stefano Sanna
                                            {dcarboni|gerda@crs4.it}
Reflection API: esercizio
                            ●   Scrivere un programma riflessivo in grado
                                di caricare una classe digitata dall'utente,
CRS4 - http://www.crs4.it




                                stabilire se è in grado o meno di stampare
                                un testo attraverso l'analisi dei suoi
                                metodi.




                                Suggerimento: leggere i suoi metodi e vedere se ce n'è
                                qualcuno che inizia per “print” e che ha tra i suoi
                                parametri una stringa di testo. Da fare su Eclipse.
                                                Davide Carboni - Stefano Sanna
                                                  {dcarboni|gerda@crs4.it}
Singleton
                            ●   Obiettivo: assicurare che, in ogni istante,
                                esista una sola istanza di una certa classe
CRS4 - http://www.crs4.it




                                all'interno dell'applicazione.
                            ●   Il Singleton è utile per identificare entità
                                “uniche” all'interno del modello o per
                                fornisce un accesso univoco a risorse di
                                sistema (si pensi al sottosistema grafico o
                                alla scheda di rete)
                            ●   E' compito della classe gestire l'accesso
                                concorrente alle funzionalita' esportate

                                             Davide Carboni - Stefano Sanna
                                               {dcarboni|gerda@crs4.it}
Singleton in Java
                            public class NetworkConnection {
                                private static NetworkConnection instance;
CRS4 - http://www.crs4.it




                                private NetworkConnection() {...}


                                public static NetworkConnection getInstance() {
                                    if (instance == null) {
                                        instance = new NetworkConnection();
                                    }
                                    return instance;
                                }
                            }

                                                    Davide Carboni - Stefano Sanna
                                                      {dcarboni|gerda@crs4.it}
Singleton in Java
                            public class NetworkConnection {
                                private static NetworkConnection instance;
CRS4 - http://www.crs4.it




                                private NetworkConnection() {...}


                                public static NetworkConnection getInstance() {
                                    if (instance == null) {
                                        instance = new NetworkConnection();
                                    }
                                    return instance;         Il costruttore e' privato:
                                                            non e' possibile ottenere
                                }                        istanze della classe all'interno
                                                            del codice di altre classi.
                            }

                                                    Davide Carboni - Stefano Sanna
                                                      {dcarboni|gerda@crs4.it}
Singleton in Java
                            public class NetworkConnection {
                                private static NetworkConnection instance;
CRS4 - http://www.crs4.it




                                private NetworkConnection() {...}
                                                                Un campo privato della classe
                                                                   conserva un riferimento
                                                                     all'unica istanza di
                                public static NetworkConnection getInstance() {
                                                                     NetworkConnection
                                    if (instance == null) {
                                        instance = new NetworkConnection();
                                    }
                                    return instance;
                                }
                            }

                                                    Davide Carboni - Stefano Sanna
                                                      {dcarboni|gerda@crs4.it}
Singleton in Java
                            public class NetworkConnection {
                                                                   getInstance() restituisce la
                                private static NetworkConnection reference all'unica istanza ed
                                                                  instance;
                                                                eventualmente la crea, se non
CRS4 - http://www.crs4.it




                                                                  disponibile (ad esempio, alla
                                private NetworkConnection() {...}      prima invocazione)


                                public static NetworkConnection getInstance() {
                                    if (instance == null) {
                                        instance = new NetworkConnection();
                                    }
                                    return instance;
                                                                          Il costruttore privato e'
                                }                                       accessibile all'interno della
                                                                                   classe!
                            }

                                                    Davide Carboni - Stefano Sanna
                                                      {dcarboni|gerda@crs4.it}
Singleton: esercizio
                            ●   Si vuole implementare il Multiton:
                                –   è una variante del Singleton, in cui si vuole
CRS4 - http://www.crs4.it




                                    limitare il numero totale di istanze di una
                                    classe (1 < n_istanze < N_MAX)
                                –   è un pattern utile per amministrare un numero
                                    finito di risorse fisiche o gestire il load
                                    balancing tra diversi elementi di codice attivo




                                                Davide Carboni - Stefano Sanna
                                                  {dcarboni|gerda@crs4.it}
Factory Method
                            ●   Obiettivo: poter decidere a runtime quale
                                classe istanziare a partire da una gerarchia
CRS4 - http://www.crs4.it




                            ●   E' un pattern utilizzato per modellare
                                sistemi reali o per aumentare la flessibilità
                                dell'architettura:
                                –   Il tipo di oggetto istanziato non deve essere
                                    esplicitato nel codice del client (niente new
                                    MyClass()...)
                                –   Le regole di funzionamento della Factory
                                    possono essere variate dinamicamente
                                    (Abstract Factory)

                                                Davide Carboni - Stefano Sanna
                                                  {dcarboni|gerda@crs4.it}
Factory Method
CRS4 - http://www.crs4.it




                                Davide Carboni - Stefano Sanna
                                  {dcarboni|gerda@crs4.it}
Factory Method in Java
                            public interface Bottle {...}
CRS4 - http://www.crs4.it




                            public class GlassBottle implements
                             Bottle {...}


                            public class PlasticBottle implements
                             Bottle {...}




                                       Davide Carboni - Stefano Sanna
                                         {dcarboni|gerda@crs4.it}
Factory Method in Java
                            public class BottleFactory {
CRS4 - http://www.crs4.it




                                public static Bottle getBottle(String content) {
                                    if (content.equals(“wine”)) {
                                        return new GlassBottle();
                                    }
                                    return new PlasticBottle();
                                }

                                                                      Se non è vino, la Factory
                                                                      restituisce sempre e solo
                            }                                          bottiglie di plastica! :-)


                                                 Davide Carboni - Stefano Sanna
                                                   {dcarboni|gerda@crs4.it}
Decorator
                            ●   Obiettivo: estendere/modificare a runtime
                                le funzionalità esportate da un oggetto
CRS4 - http://www.crs4.it




                                senza modificarne l'interfaccia pubblica
                            ●   Noto anche come “wrapper”, si utilizza
                                quando il subclassing non e' possibile o
                                occorre una modifica a runtime del
                                funzionamento di un componente
                            ●   Il Decorator si presenta con la medesima
                                interfaccia dell'oggetto originale ma ha
                                implementazione differente

                                            Davide Carboni - Stefano Sanna
                                              {dcarboni|gerda@crs4.it}
Decorator
CRS4 - http://www.crs4.it




                             Davide Carboni - Stefano Sanna
                               {dcarboni|gerda@crs4.it}
Decorator
CRS4 - http://www.crs4.it




                             Davide Carboni - Stefano Sanna
                               {dcarboni|gerda@crs4.it}
Decorator in Java
                            public interface TemperatureSensor {
                                public float getTemperature();
CRS4 - http://www.crs4.it




                            }


                            public class SerialTemperatureSensor {
                                public float getTemperature() {
                                    float temperature;
                                    // legge la temperatura dal sensore seriale...


                                    return termperature;
                                }
                            }

                                                  Davide Carboni - Stefano Sanna
                                                    {dcarboni|gerda@crs4.it}
Decorator in Java
                            public abstract class TemperatureConverter implements
                              TemperatureSensor {
                                protected TemperatureSensor source;
CRS4 - http://www.crs4.it




                                public TemperatureConverter(TemperatureSensor sensor) {
                                    this.source = sensor;
                                }
                            }


                                                                         L'oggetto originale viene
                                                                       utilizzato come “sorgente di
                                                                          dati”, che saranno poi
                                                                     elaborati dalle implementazioni
                                                                          concrete del Decorator

                                                  Davide Carboni - Stefano Sanna
                                                    {dcarboni|gerda@crs4.it}
Decorator in Java
                            public class CelsiusTemperatureSensor extends
                              TemperatureConverter {
CRS4 - http://www.crs4.it




                                public CelsiusTemperatureSensor(TemperatureSensor sensor)
                                {
                                    super(sensor);
                                }


                                public float getTemperature() {
                                    return (source.getTemperature() - 273.15);
                                }
                            }


                                                     Davide Carboni - Stefano Sanna
                                                       {dcarboni|gerda@crs4.it}
Adapter
                            ●   Obiettivo: rendere interoperabili due
                                oggetti aventi interfacce incompatibili
CRS4 - http://www.crs4.it




                            ●   E' un Design Pattern mirato al riuso del
                                codice e fornisce una soluzione “collante”
                                tra due oggetti non progettati per lavorare
                                assieme
                            ●   Si pensi, ad esempio, ad un software di
                                comunicazione per il quale è richiesto il
                                supporto di un nuovo protocollo: sarà
                                compito di un adattatore i due componenti

                                             Davide Carboni - Stefano Sanna
                                               {dcarboni|gerda@crs4.it}
Adapter
                            ●   L'oggetto Adapter espone una interfaccia
                                pubblica compatibile con quella attesa
CRS4 - http://www.crs4.it




                                dall'oggetto client e invoca, eseguendo
                                eventuali procedure accessorie, gli
                                opportuni metodi sull'oggetto server

                            ●   Un Adapter che esporta un'unica
                                interfaccia pubblica che colleziona
                                funzionalità di diverse classi e' detto
                                Facade


                                             Davide Carboni - Stefano Sanna
                                               {dcarboni|gerda@crs4.it}
Adapter
CRS4 - http://www.crs4.it




                            Davide Carboni - Stefano Sanna
                              {dcarboni|gerda@crs4.it}
Adapter: esercizio
                            ●   Scrivere un Adapter che permetta di
                                adattare un java.lang.Integer per... gestire i
CRS4 - http://www.crs4.it




                                numeri romani!




                                             Davide Carboni - Stefano Sanna
                                               {dcarboni|gerda@crs4.it}
Observer
                            ●   Obiettivo: notificare le modifiche allo stato
                                di un oggetto
CRS4 - http://www.crs4.it




                            ●   Diversi i casi in cui questo DP è utilizzato
                                efficacemente:
                                –   Gestione eventi (mouse, tastiera) delle
                                    interfacce grafiche
                                –   Propagazione di variazione su strutture dati
                                –   Implementazione di sistemi asincroni (non
                                    bloccanti)



                                                Davide Carboni - Stefano Sanna
                                                  {dcarboni|gerda@crs4.it}
Observer
CRS4 - http://www.crs4.it




                             Davide Carboni - Stefano Sanna
                               {dcarboni|gerda@crs4.it}
Composite
                            ●   Obiettivo: gestire efficacemente strutture
                                composte (ad esempio, alberi)
CRS4 - http://www.crs4.it




                            ●   Permette di maneggiare in maniera
                                uniforme contenitori e componenti
                                elementari.
                                –   Componenti e Contenitori condividono la stessa
                                    interfaccia pubblica
                                –   I Contenitori hanno la possibilità di aggiungere
                                    nuovi Componenti e Contenitori



                                                Davide Carboni - Stefano Sanna
                                                  {dcarboni|gerda@crs4.it}
Composite
CRS4 - http://www.crs4.it




                             Davide Carboni - Stefano Sanna
                               {dcarboni|gerda@crs4.it}
Composite in Java
                            public class Component {...}
CRS4 - http://www.crs4.it




                            public class Composite extends Component {
                                private Collection children;


                                public void addChild(Component c) {...}


                            }




                                             Davide Carboni - Stefano Sanna
                                               {dcarboni|gerda@crs4.it}
Iterator
                            ●   Obiettivo: disporre di uno strumento
                                generico per accedere sequenzialmente e
CRS4 - http://www.crs4.it




                                ad una collezione di dati
                            ●   Strutture dati diverse (liste, vettori, vettori
                                associativi, insiemi...) hanno strumenti di
                                accesso completamente diversi e un
                                cambio di struttura dati può richiedere la
                                modifica del codice client: un Iterator
                                semplifica notevolmente l'accesso ai dati,
                                fornendo una interfaccia “standard” e
                                generalizzata
                                             Davide Carboni - Stefano Sanna
                                               {dcarboni|gerda@crs4.it}
Iterator
CRS4 - http://www.crs4.it




                            Davide Carboni - Stefano Sanna
                              {dcarboni|gerda@crs4.it}
Template
                            ●   Supponiamo che sappiate che un algoritmo
                                è composto da un certo numero di step
CRS4 - http://www.crs4.it




                                eseguiti sempre in un certo ordine
                            ●   Tuttavia questi step possono cambiare
                                nella loro implementazione a seconda del
                                tipo di oggetto
                            ●   Esempio.
                                Sappiamo che un animale che vuol
                                mangiare una banana in cima ad un albero
                                deve eseguire sempre le stesse operazioni:

                                            Davide Carboni - Stefano Sanna
                                              {dcarboni|gerda@crs4.it}
Template
                            public abstract class Animale{
                                public void mangia(Frutto f){
CRS4 - http://www.crs4.it




                                    localizza(f);
                                    accedi(f);
                                    sbuccia(f);
                                    ...
                                }
                            }

                                localizza, accedi, sbuccia sono tutti
                                metodi astratti della classe Animale.
                                Saranno le sottoclassi a implementarli.
                                                  Davide Carboni - Stefano Sanna
                                                    {dcarboni|gerda@crs4.it}
Template
                            ●   Ad esempio, una scimmia localizza il frutto
                                con la vista, accede ad esso
CRS4 - http://www.crs4.it




                                arrampicandosi e lo sbuccia usando le
                                “mani”

                            ●   Un elefante lo localizza con la vista, accede
                                con la proboscide, lo sbuccia con la bocca
                                sputando la buccia, e poi ingurgita cio' che
                                resta per mangiarlo



                                             Davide Carboni - Stefano Sanna
                                               {dcarboni|gerda@crs4.it}
Template
                                                Animale
                                         mangia(Frutto)
CRS4 - http://www.crs4.it




                                         localizza(Frutto)
                                         accedi(Frutto)
                                         sbuccia(Frutto)




                                  Elefante                             Scimmia

                            localizza(Frutto)                   localizza(Frutto)
                            accedi(Frutto)                      accedi(Frutto)
                            sbuccia(Frutto)                     sbuccia(Frutto)


                                                Davide Carboni - Stefano Sanna
                                                  {dcarboni|gerda@crs4.it}
Proxy
                            ●   Problema: si ha la necessità di accedere
                                alle funzionalità di un oggetto
CRS4 - http://www.crs4.it




                                “inaccessibile” come se questo fosse un
                                oggetto ordinario
                            ●   Per esempio l'oggetto è...
                                –   Esiste ma in un altro processo
                                –   E’ ancora serializzato
                                –   E’ compresso
                                –   Non e’ ancora stato costruito …


                                                Davide Carboni - Stefano Sanna
                                                  {dcarboni|gerda@crs4.it}
Proxy
CRS4 - http://www.crs4.it




                            Davide Carboni - Stefano Sanna
                              {dcarboni|gerda@crs4.it}
Remote Proxy
                            ●   Fornisce un oggetto locale che rappresenta
                                un altro oggetto remoto (in generale in un
CRS4 - http://www.crs4.it




                                diverso address space) con il quale e’
                                collegato




                                            Davide Carboni - Stefano Sanna
                                              {dcarboni|gerda@crs4.it}
Virtual Proxy
                            ●   Crea oggetti on demand solo se veramente
                                necessario. Altrimenti cerca di sostituirsi in
CRS4 - http://www.crs4.it




                                tutto e per tutto al suo subject.




                                             Davide Carboni - Stefano Sanna
                                               {dcarboni|gerda@crs4.it}
Protection Proxy
                            ●   Aggiunge dei controlli all'esecuzione di
                                metodi sul subject.
CRS4 - http://www.crs4.it




                            ●   Ad esempio se il subject è il vostro conto in
                                banca il proxy potrebbe chiedervi il PIN
                                prima di eseguire l'operazione PRELIEVO




                                             Davide Carboni - Stefano Sanna
                                               {dcarboni|gerda@crs4.it}
Proxy
                                     Subject
                                          f( )
                                          g()
CRS4 - http://www.crs4.it




                                          h()




                            Proxy                                     RealSubject

                               f()                                       f()
                               g()                                       g()
                               h()                                       h()



                                     Davide Carboni - Stefano Sanna
                                       {dcarboni|gerda@crs4.it}
Command
                                               Command

                                                execute( )
CRS4 - http://www.crs4.it




                                 ConcreteCommand
                            execute( )
                            ConcreteCommand(Context)
                                                                  doSomething( )
                                                                  for (...)
                                                                  print( )
                                                                  ...

                                          Davide Carboni - Stefano Sanna
                                            {dcarboni|gerda@crs4.it}
Command
                            ●   Problema: Schedulare delle azioni per
                                l'esecuzione temporizzate
CRS4 - http://www.crs4.it




                            ●   Problema: Una GUI in cui lo stesso
                                comando puo' essere inviato in diversi
                                modi (bottone, menu, ...). Tutti i modi sono
                                inibiti se il comando non è disponibile
                            ●   Problema: mettere in una coda una serie di
                                azioni
                            ●   Problema: UNDO


                                            Davide Carboni - Stefano Sanna
                                              {dcarboni|gerda@crs4.it}
Command
                            ●   Tutti questi problemi trovano una soluzione
                                comune nel Command
CRS4 - http://www.crs4.it




                            ●   Il Command incapsula un'azione in un
                                oggetto. Questo consente di costruire code
                                di Command, di associare un Command a
                                delle GUI, di schedulare l'esecuzione
                                temporizzata




                                            Davide Carboni - Stefano Sanna
                                              {dcarboni|gerda@crs4.it}
Command e Thread
                                             Thread

                                                 run( )
CRS4 - http://www.crs4.it




                             MyThread
                            run( )
                            MyThread(Context)
                                                                doSomething( )
                                                                for (...)
                                                                print( )
                                                                ...

                                        Davide Carboni - Stefano Sanna
                                          {dcarboni|gerda@crs4.it}
Command: esercizio
                            ●   Costruire una classe Task che ogni 10sec
                                viene messa in esecuzione.
CRS4 - http://www.crs4.it




                                Suggerimento: Utilizzare le classi
                                java.util.Timer e java.util.TimerTask

                                            Davide Carboni - Stefano Sanna
                                              {dcarboni|gerda@crs4.it}
State
                            ●   Problema: simulare un video-registratore
                            ●   I comandi possibili sono play(), rec(),
CRS4 - http://www.crs4.it




                                pause(), fwd(), rew(), stop().
                            ●   Gli stati possibili sono:
                                –   STILL, PLAYING, FASTPLAYFW,
                                    FASTPLAYRW,PAUSED,RECORDING,REWINDING,
                                    FORWARDING,




                                              Davide Carboni - Stefano Sanna
                                                {dcarboni|gerda@crs4.it}
State
                            ●   Inizio con una classe VCR.
CRS4 - http://www.crs4.it




                                            VCR

                                  play()
                                  stop()
                                  rec()
                                  pause()
                                  fwd()
                                  rew()

                                   int STATE




                                                  Davide Carboni - Stefano Sanna
                                                    {dcarboni|gerda@crs4.it}
State
                            ●   Il problema è che in ogni metodo avrò dei
                                costrutti molto spaghetti-code:
CRS4 - http://www.crs4.it




                                public void play(){
                                if(STATE==PLAYING)
                                //do nothing
                                else if(STATE == STILL)
                                  startTapeEngine();
                                  ...
                                else if(STATE == RECORDING)
                                  ...

                                            Davide Carboni - Stefano Sanna
                                              {dcarboni|gerda@crs4.it}
State
                            ●   Cerchiamo un approccio più Object-
                                Oriented
CRS4 - http://www.crs4.it




                                            Davide Carboni - Stefano Sanna
                                              {dcarboni|gerda@crs4.it}
State
                                      VCR

                            play()
CRS4 - http://www.crs4.it




                            stop()                                              State
                            rec()
                            pause()                                  play(){} //vuoti
                            fwd()                                    stop(){}
                            rew()                                    rec(){}
                                                                     pause(){}
                             State currentState=                     fwd(){}
                             new StillState()          1:1           rew(){}
                                                                      VCR vcr




                                                   Davide Carboni - Stefano Sanna
                                                     {dcarboni|gerda@crs4.it}
State
                                     State
                            play(){} //vuoti                                     PlayingState
CRS4 - http://www.crs4.it




                            stop(){}
                            rec(){}                                         stop()
                            pause(){}                                       fwd()
                            fwd(){}                                         rew()
                            rew(){}                                         pause()

                             VCR vcr
                                                               StillState
                                                    play()
                                                    rec()
                                                    fwd()
                                                    rew()
                                               Davide Carboni - Stefano Sanna
                                                 {dcarboni|gerda@crs4.it}
Uso dei DP della API Java
                            ●   I DP sono utilizzati diffusamente all'interno
                                dell'API Java e costituiscono un valido
CRS4 - http://www.crs4.it




                                esempio di uso sapiente di questa
                                metodologia
                            ●   (Ri)conoscere l'adozione di un pattern
                                nell'API standard aiuta a comprendere
                                meglio l'architettura della libreria e scrivere
                                codice allineato con il design degli
                                sviluppatori Sun e JCP



                                             Davide Carboni - Stefano Sanna
                                               {dcarboni|gerda@crs4.it}
Decorator in J2SE
                            ●   Il DP Decorator e' presente in alcune classi
                                fondamentali per la gestione delle
CRS4 - http://www.crs4.it




                                funzionalita' di I/O:
                                –   InputStream e OutputStream sono le classi basi
                                    per la gestione dei flussi generici di ingresso ed
                                    uscita
                                –   Opportune sottoclassi di
                                    FilterInput/OutputStream forniscono, in modo
                                    trasparente, funzionalita' di buffering,
                                    compressione e cifratura



                                                Davide Carboni - Stefano Sanna
                                                  {dcarboni|gerda@crs4.it}
Decorator in J2SE
CRS4 - http://www.crs4.it




                                 Davide Carboni - Stefano Sanna
                                   {dcarboni|gerda@crs4.it}
Adapter in J2SE
                            ●   Un esempio di Adapter in J2SE e' presente
                                nella gestione I/O. Dispongono di alcuni
CRS4 - http://www.crs4.it




                                adattatori:
                                –   DataInput/OutputStream: gestione tipi primitivi
                                    e stringhe, generando un opportuno stream di
                                    byte[]
                                –   Writer e Reader si occupano della gestione dei
                                    caratteri nei formati Unicode e UTF-8




                                                Davide Carboni - Stefano Sanna
                                                  {dcarboni|gerda@crs4.it}
Adapter in J2SE
                            ●   L'esempio più forte di adozione del DP
                                Adapter è il framework della Java Native
CRS4 - http://www.crs4.it




                                Interface (JNI):
                                –   Gli strumenti forniti con il JDK permettono di
                                    creare degli Adapter tra codice nativo (librerie
                                    a caricamento dinamico scritte con qualsiasi
                                    linguaggio) e il codice Java in esecuzione sulla
                                    JVM
                                –   Un blocco di codice intermedio si occupa di
                                    tradurre le metodi e oggetti Java nei
                                    corrispondenti nativi


                                                Davide Carboni - Stefano Sanna
                                                  {dcarboni|gerda@crs4.it}
Composite in J2SE
                            ●   Il DP Composite è fondamentale nel design
                                delle interfacce grafiche
CRS4 - http://www.crs4.it




                            ●   I componenti delle librerie AWT e Swing
                                sono modellati come Component e i
                                pannelli sono modellati come Container
                                (Composite):
                                –   Component: Button, Label, TextField...
                                –   Container: Panel, Frame, Window, Dialog...




                                               Davide Carboni - Stefano Sanna
                                                 {dcarboni|gerda@crs4.it}
Iterator in J2SE
                            ●   La Collection API, introdotta con l'avvento
                                della piattaforma Java2, fornisce una ricco
CRS4 - http://www.crs4.it




                                insieme di classi per la gestione di
                                collezioni di dati:
                                –   Vettori
                                –   Liste
                                –   Tabelle di hash
                                –   Insiemi
                            ●   L'accesso uniforme ai dati è ottenuto
                                attraverso una istanza di Iterator

                                                Davide Carboni - Stefano Sanna
                                                  {dcarboni|gerda@crs4.it}
Domande?
CRS4 - http://www.crs4.it




                             Davide Carboni - Stefano Sanna
                               {dcarboni|gerda@crs4.it}
Bibliografia
CRS4 - http://www.crs4.it




                            ●   Design Patterns
                                Elements of Reusable Object-Oriented Software
                                E. Gamma, R. Helm, R. Johnson, J. Vlissides
                                Addison-Wesley, 1994
                                ISBN: 0201633612




                                                   Davide Carboni - Stefano Sanna
                                                     {dcarboni|gerda@crs4.it}
Conclusioni
                            ●   I DP sono la formalizzazione di buone
                                soluzioni a problemi generali che possono
CRS4 - http://www.crs4.it




                                presentarsi nella progettazione/sviluppo di
                                un software
                            ●   I DP forniscono una possibile soluzione ad
                                una classe di problemi
                            ●   L'uso esagerato/sistematico dei DP puo'
                                portare ad un peggioramento della qualita'
                                del codice (non facciamo la classe String
                                come Composite di caratteri e stringhe, a
                                loro volta generati da una factory...)
                                            Davide Carboni - Stefano Sanna
                                              {dcarboni|gerda@crs4.it}
Grazie... :-)
CRS4 - http://www.crs4.it




                              Davide Carboni - Stefano Sanna
                                {dcarboni|gerda@crs4.it}

More Related Content

PDF
Internet of Things al Festivalscienza 2010
PDF
Design patterns - parte 1
PDF
Corso GOF Design Pattern
PDF
Lezione 5: Design Pattern Creazionali
PDF
pattern
PDF
Acceleratori hardware del calcolo ad alte prestazioni
PDF
Un plug-in Eclipse per il supporto all'Extract Class Refactoring
PDF
Java AWT
Internet of Things al Festivalscienza 2010
Design patterns - parte 1
Corso GOF Design Pattern
Lezione 5: Design Pattern Creazionali
pattern
Acceleratori hardware del calcolo ad alte prestazioni
Un plug-in Eclipse per il supporto all'Extract Class Refactoring
Java AWT

More from Davide Carboni (20)

PDF
Facts & Figures about Web3 Security in 2024
PPTX
PPT-CyberJourney-June-2023-Carboni.pptx
PDF
From Smart Contracts to NFT
PDF
Blockchain School 2019 - Security of Smart Contracts.pdf
PDF
The Bitcoin blockchain (en)
PDF
Internet-of-things, sicurezza, privacy, trust
PDF
Blockchain - crittomonete, Bitcoin e altre applicazioni
ODP
08 mapreduce
PDF
04 bloom
PDF
2 phase-commit
PDF
Pysense: wireless sensor computing in Python?
PDF
The world is the computer and the programmer is you
PDF
Browsing Large Collections of Geo-Tagged Pictures
PDF
Programmazione concorrente in Java (vecchio modello)
PPT
NAT Traversal
PPT
Introduction P2p
PDF
Spoleto07
ODP
Kickoff del Progetto Cluster Mashup e Geoweb
ODP
Open al bivio fra software e webware (al javaday 2006)
ODP
Web 2.0, mashup e GeoWeb
Facts & Figures about Web3 Security in 2024
PPT-CyberJourney-June-2023-Carboni.pptx
From Smart Contracts to NFT
Blockchain School 2019 - Security of Smart Contracts.pdf
The Bitcoin blockchain (en)
Internet-of-things, sicurezza, privacy, trust
Blockchain - crittomonete, Bitcoin e altre applicazioni
08 mapreduce
04 bloom
2 phase-commit
Pysense: wireless sensor computing in Python?
The world is the computer and the programmer is you
Browsing Large Collections of Geo-Tagged Pictures
Programmazione concorrente in Java (vecchio modello)
NAT Traversal
Introduction P2p
Spoleto07
Kickoff del Progetto Cluster Mashup e Geoweb
Open al bivio fra software e webware (al javaday 2006)
Web 2.0, mashup e GeoWeb
Ad

Introduzione ai Design Patterns nella Programmazione a Oggetti

  • 1. Design Pattern CRS4 - http://www.crs4.it Basic Tutorial aprile 2005 Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 2. Agenda ● Programmazione OO Avanzata: – Reflection CRS4 - http://www.crs4.it – Introduzione ai Design Pattern ● I pattern principali ● I pattern dell'API di Java ● Bibliografia ● Conclusioni Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 3. Introduzione ai Design Pattern CRS4 - http://www.crs4.it Vogliamo progettare il primo piano della nostra villetta disponendo 3 camere da letto e un bagno. Nessuna finestra deve aprirsi a nord. Nessuna camera da letto deve essere meno ampia di 9mq Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 4. Introduzione ai Design Pattern CRS4 - http://www.crs4.it scala L3 L1 WC L2 Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 5. Introduzione ai Design Pattern CRS4 - http://www.crs4.it scala L3 L1 WC L2 Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 6. Introduzione ai Design Pattern ● Dato un problema, troviamo una soluzione CRS4 - http://www.crs4.it ● Data una classe di problemi simili, troviamo una classe di soluzioni simili ● Una classe di soluzioni rappresenta una architettura generica detta “pattern” Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 7. Reflection ● La riflessività è la capacità del codice di eseguire una “computazione” su una CRS4 - http://www.crs4.it “computazione” ● In altre parole: dato un programma, questo è riflessivo se è in grado di estrarre informazioni sulla sua struttura ● La riflessività può essere anche “attiva” se il programma può anche cambiare la sua struttura oltre che “capirla” Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 8. Reflection: esempio Frame f=new Frame("Pippo"); f.setVisible(true); ... è equivalente a: CRS4 - http://www.crs4.it Class myclass = Class.forName("java.awt.Frame"); Constructor constructor = myclass.getConstructor(new Class[] {String.class}); Object o = constructor.newInstance(new Object[] {"Pippo Riflessivo"}); Method m2 = myclass.getMethod("setVisible",new Class[]{Boolean.TYPE}); m2.invoke(o,new Object[]{new Boolean(true)}); Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 9. Reflection: classi e metaclassi Class methods=[invoke(), getMethod()] fields=[methods, fields, ...] CRS4 - http://www.crs4.it Is instance of Point methods=[f( ), g( ), h( )] fields=[X, Y] Is instance of Is instance of aPoint X=45, Y=25 Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 10. Reflection API ● Vedere documentazione SDK CRS4 - http://www.crs4.it Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 11. Reflection API: esercizio ● Scrivere un programma riflessivo in grado di caricare una classe digitata dall'utente, CRS4 - http://www.crs4.it stabilire se è in grado o meno di stampare un testo attraverso l'analisi dei suoi metodi. Suggerimento: leggere i suoi metodi e vedere se ce n'è qualcuno che inizia per “print” e che ha tra i suoi parametri una stringa di testo. Da fare su Eclipse. Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 12. Singleton ● Obiettivo: assicurare che, in ogni istante, esista una sola istanza di una certa classe CRS4 - http://www.crs4.it all'interno dell'applicazione. ● Il Singleton è utile per identificare entità “uniche” all'interno del modello o per fornisce un accesso univoco a risorse di sistema (si pensi al sottosistema grafico o alla scheda di rete) ● E' compito della classe gestire l'accesso concorrente alle funzionalita' esportate Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 13. Singleton in Java public class NetworkConnection { private static NetworkConnection instance; CRS4 - http://www.crs4.it private NetworkConnection() {...} public static NetworkConnection getInstance() { if (instance == null) { instance = new NetworkConnection(); } return instance; } } Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 14. Singleton in Java public class NetworkConnection { private static NetworkConnection instance; CRS4 - http://www.crs4.it private NetworkConnection() {...} public static NetworkConnection getInstance() { if (instance == null) { instance = new NetworkConnection(); } return instance; Il costruttore e' privato: non e' possibile ottenere } istanze della classe all'interno del codice di altre classi. } Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 15. Singleton in Java public class NetworkConnection { private static NetworkConnection instance; CRS4 - http://www.crs4.it private NetworkConnection() {...} Un campo privato della classe conserva un riferimento all'unica istanza di public static NetworkConnection getInstance() { NetworkConnection if (instance == null) { instance = new NetworkConnection(); } return instance; } } Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 16. Singleton in Java public class NetworkConnection { getInstance() restituisce la private static NetworkConnection reference all'unica istanza ed instance; eventualmente la crea, se non CRS4 - http://www.crs4.it disponibile (ad esempio, alla private NetworkConnection() {...} prima invocazione) public static NetworkConnection getInstance() { if (instance == null) { instance = new NetworkConnection(); } return instance; Il costruttore privato e' } accessibile all'interno della classe! } Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 17. Singleton: esercizio ● Si vuole implementare il Multiton: – è una variante del Singleton, in cui si vuole CRS4 - http://www.crs4.it limitare il numero totale di istanze di una classe (1 < n_istanze < N_MAX) – è un pattern utile per amministrare un numero finito di risorse fisiche o gestire il load balancing tra diversi elementi di codice attivo Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 18. Factory Method ● Obiettivo: poter decidere a runtime quale classe istanziare a partire da una gerarchia CRS4 - http://www.crs4.it ● E' un pattern utilizzato per modellare sistemi reali o per aumentare la flessibilità dell'architettura: – Il tipo di oggetto istanziato non deve essere esplicitato nel codice del client (niente new MyClass()...) – Le regole di funzionamento della Factory possono essere variate dinamicamente (Abstract Factory) Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 19. Factory Method CRS4 - http://www.crs4.it Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 20. Factory Method in Java public interface Bottle {...} CRS4 - http://www.crs4.it public class GlassBottle implements Bottle {...} public class PlasticBottle implements Bottle {...} Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 21. Factory Method in Java public class BottleFactory { CRS4 - http://www.crs4.it public static Bottle getBottle(String content) { if (content.equals(“wine”)) { return new GlassBottle(); } return new PlasticBottle(); } Se non è vino, la Factory restituisce sempre e solo } bottiglie di plastica! :-) Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 22. Decorator ● Obiettivo: estendere/modificare a runtime le funzionalità esportate da un oggetto CRS4 - http://www.crs4.it senza modificarne l'interfaccia pubblica ● Noto anche come “wrapper”, si utilizza quando il subclassing non e' possibile o occorre una modifica a runtime del funzionamento di un componente ● Il Decorator si presenta con la medesima interfaccia dell'oggetto originale ma ha implementazione differente Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 23. Decorator CRS4 - http://www.crs4.it Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 24. Decorator CRS4 - http://www.crs4.it Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 25. Decorator in Java public interface TemperatureSensor { public float getTemperature(); CRS4 - http://www.crs4.it } public class SerialTemperatureSensor { public float getTemperature() { float temperature; // legge la temperatura dal sensore seriale... return termperature; } } Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 26. Decorator in Java public abstract class TemperatureConverter implements TemperatureSensor { protected TemperatureSensor source; CRS4 - http://www.crs4.it public TemperatureConverter(TemperatureSensor sensor) { this.source = sensor; } } L'oggetto originale viene utilizzato come “sorgente di dati”, che saranno poi elaborati dalle implementazioni concrete del Decorator Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 27. Decorator in Java public class CelsiusTemperatureSensor extends TemperatureConverter { CRS4 - http://www.crs4.it public CelsiusTemperatureSensor(TemperatureSensor sensor) { super(sensor); } public float getTemperature() { return (source.getTemperature() - 273.15); } } Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 28. Adapter ● Obiettivo: rendere interoperabili due oggetti aventi interfacce incompatibili CRS4 - http://www.crs4.it ● E' un Design Pattern mirato al riuso del codice e fornisce una soluzione “collante” tra due oggetti non progettati per lavorare assieme ● Si pensi, ad esempio, ad un software di comunicazione per il quale è richiesto il supporto di un nuovo protocollo: sarà compito di un adattatore i due componenti Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 29. Adapter ● L'oggetto Adapter espone una interfaccia pubblica compatibile con quella attesa CRS4 - http://www.crs4.it dall'oggetto client e invoca, eseguendo eventuali procedure accessorie, gli opportuni metodi sull'oggetto server ● Un Adapter che esporta un'unica interfaccia pubblica che colleziona funzionalità di diverse classi e' detto Facade Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 30. Adapter CRS4 - http://www.crs4.it Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 31. Adapter: esercizio ● Scrivere un Adapter che permetta di adattare un java.lang.Integer per... gestire i CRS4 - http://www.crs4.it numeri romani! Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 32. Observer ● Obiettivo: notificare le modifiche allo stato di un oggetto CRS4 - http://www.crs4.it ● Diversi i casi in cui questo DP è utilizzato efficacemente: – Gestione eventi (mouse, tastiera) delle interfacce grafiche – Propagazione di variazione su strutture dati – Implementazione di sistemi asincroni (non bloccanti) Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 33. Observer CRS4 - http://www.crs4.it Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 34. Composite ● Obiettivo: gestire efficacemente strutture composte (ad esempio, alberi) CRS4 - http://www.crs4.it ● Permette di maneggiare in maniera uniforme contenitori e componenti elementari. – Componenti e Contenitori condividono la stessa interfaccia pubblica – I Contenitori hanno la possibilità di aggiungere nuovi Componenti e Contenitori Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 35. Composite CRS4 - http://www.crs4.it Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 36. Composite in Java public class Component {...} CRS4 - http://www.crs4.it public class Composite extends Component { private Collection children; public void addChild(Component c) {...} } Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 37. Iterator ● Obiettivo: disporre di uno strumento generico per accedere sequenzialmente e CRS4 - http://www.crs4.it ad una collezione di dati ● Strutture dati diverse (liste, vettori, vettori associativi, insiemi...) hanno strumenti di accesso completamente diversi e un cambio di struttura dati può richiedere la modifica del codice client: un Iterator semplifica notevolmente l'accesso ai dati, fornendo una interfaccia “standard” e generalizzata Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 38. Iterator CRS4 - http://www.crs4.it Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 39. Template ● Supponiamo che sappiate che un algoritmo è composto da un certo numero di step CRS4 - http://www.crs4.it eseguiti sempre in un certo ordine ● Tuttavia questi step possono cambiare nella loro implementazione a seconda del tipo di oggetto ● Esempio. Sappiamo che un animale che vuol mangiare una banana in cima ad un albero deve eseguire sempre le stesse operazioni: Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 40. Template public abstract class Animale{ public void mangia(Frutto f){ CRS4 - http://www.crs4.it localizza(f); accedi(f); sbuccia(f); ... } } localizza, accedi, sbuccia sono tutti metodi astratti della classe Animale. Saranno le sottoclassi a implementarli. Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 41. Template ● Ad esempio, una scimmia localizza il frutto con la vista, accede ad esso CRS4 - http://www.crs4.it arrampicandosi e lo sbuccia usando le “mani” ● Un elefante lo localizza con la vista, accede con la proboscide, lo sbuccia con la bocca sputando la buccia, e poi ingurgita cio' che resta per mangiarlo Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 42. Template Animale mangia(Frutto) CRS4 - http://www.crs4.it localizza(Frutto) accedi(Frutto) sbuccia(Frutto) Elefante Scimmia localizza(Frutto) localizza(Frutto) accedi(Frutto) accedi(Frutto) sbuccia(Frutto) sbuccia(Frutto) Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 43. Proxy ● Problema: si ha la necessità di accedere alle funzionalità di un oggetto CRS4 - http://www.crs4.it “inaccessibile” come se questo fosse un oggetto ordinario ● Per esempio l'oggetto è... – Esiste ma in un altro processo – E’ ancora serializzato – E’ compresso – Non e’ ancora stato costruito … Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 44. Proxy CRS4 - http://www.crs4.it Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 45. Remote Proxy ● Fornisce un oggetto locale che rappresenta un altro oggetto remoto (in generale in un CRS4 - http://www.crs4.it diverso address space) con il quale e’ collegato Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 46. Virtual Proxy ● Crea oggetti on demand solo se veramente necessario. Altrimenti cerca di sostituirsi in CRS4 - http://www.crs4.it tutto e per tutto al suo subject. Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 47. Protection Proxy ● Aggiunge dei controlli all'esecuzione di metodi sul subject. CRS4 - http://www.crs4.it ● Ad esempio se il subject è il vostro conto in banca il proxy potrebbe chiedervi il PIN prima di eseguire l'operazione PRELIEVO Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 48. Proxy Subject f( ) g() CRS4 - http://www.crs4.it h() Proxy RealSubject f() f() g() g() h() h() Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 49. Command Command execute( ) CRS4 - http://www.crs4.it ConcreteCommand execute( ) ConcreteCommand(Context) doSomething( ) for (...) print( ) ... Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 50. Command ● Problema: Schedulare delle azioni per l'esecuzione temporizzate CRS4 - http://www.crs4.it ● Problema: Una GUI in cui lo stesso comando puo' essere inviato in diversi modi (bottone, menu, ...). Tutti i modi sono inibiti se il comando non è disponibile ● Problema: mettere in una coda una serie di azioni ● Problema: UNDO Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 51. Command ● Tutti questi problemi trovano una soluzione comune nel Command CRS4 - http://www.crs4.it ● Il Command incapsula un'azione in un oggetto. Questo consente di costruire code di Command, di associare un Command a delle GUI, di schedulare l'esecuzione temporizzata Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 52. Command e Thread Thread run( ) CRS4 - http://www.crs4.it MyThread run( ) MyThread(Context) doSomething( ) for (...) print( ) ... Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 53. Command: esercizio ● Costruire una classe Task che ogni 10sec viene messa in esecuzione. CRS4 - http://www.crs4.it Suggerimento: Utilizzare le classi java.util.Timer e java.util.TimerTask Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 54. State ● Problema: simulare un video-registratore ● I comandi possibili sono play(), rec(), CRS4 - http://www.crs4.it pause(), fwd(), rew(), stop(). ● Gli stati possibili sono: – STILL, PLAYING, FASTPLAYFW, FASTPLAYRW,PAUSED,RECORDING,REWINDING, FORWARDING, Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 55. State ● Inizio con una classe VCR. CRS4 - http://www.crs4.it VCR play() stop() rec() pause() fwd() rew() int STATE Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 56. State ● Il problema è che in ogni metodo avrò dei costrutti molto spaghetti-code: CRS4 - http://www.crs4.it public void play(){ if(STATE==PLAYING) //do nothing else if(STATE == STILL) startTapeEngine(); ... else if(STATE == RECORDING) ... Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 57. State ● Cerchiamo un approccio più Object- Oriented CRS4 - http://www.crs4.it Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 58. State VCR play() CRS4 - http://www.crs4.it stop() State rec() pause() play(){} //vuoti fwd() stop(){} rew() rec(){} pause(){} State currentState= fwd(){} new StillState() 1:1 rew(){} VCR vcr Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 59. State State play(){} //vuoti PlayingState CRS4 - http://www.crs4.it stop(){} rec(){} stop() pause(){} fwd() fwd(){} rew() rew(){} pause() VCR vcr StillState play() rec() fwd() rew() Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 60. Uso dei DP della API Java ● I DP sono utilizzati diffusamente all'interno dell'API Java e costituiscono un valido CRS4 - http://www.crs4.it esempio di uso sapiente di questa metodologia ● (Ri)conoscere l'adozione di un pattern nell'API standard aiuta a comprendere meglio l'architettura della libreria e scrivere codice allineato con il design degli sviluppatori Sun e JCP Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 61. Decorator in J2SE ● Il DP Decorator e' presente in alcune classi fondamentali per la gestione delle CRS4 - http://www.crs4.it funzionalita' di I/O: – InputStream e OutputStream sono le classi basi per la gestione dei flussi generici di ingresso ed uscita – Opportune sottoclassi di FilterInput/OutputStream forniscono, in modo trasparente, funzionalita' di buffering, compressione e cifratura Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 62. Decorator in J2SE CRS4 - http://www.crs4.it Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 63. Adapter in J2SE ● Un esempio di Adapter in J2SE e' presente nella gestione I/O. Dispongono di alcuni CRS4 - http://www.crs4.it adattatori: – DataInput/OutputStream: gestione tipi primitivi e stringhe, generando un opportuno stream di byte[] – Writer e Reader si occupano della gestione dei caratteri nei formati Unicode e UTF-8 Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 64. Adapter in J2SE ● L'esempio più forte di adozione del DP Adapter è il framework della Java Native CRS4 - http://www.crs4.it Interface (JNI): – Gli strumenti forniti con il JDK permettono di creare degli Adapter tra codice nativo (librerie a caricamento dinamico scritte con qualsiasi linguaggio) e il codice Java in esecuzione sulla JVM – Un blocco di codice intermedio si occupa di tradurre le metodi e oggetti Java nei corrispondenti nativi Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 65. Composite in J2SE ● Il DP Composite è fondamentale nel design delle interfacce grafiche CRS4 - http://www.crs4.it ● I componenti delle librerie AWT e Swing sono modellati come Component e i pannelli sono modellati come Container (Composite): – Component: Button, Label, TextField... – Container: Panel, Frame, Window, Dialog... Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 66. Iterator in J2SE ● La Collection API, introdotta con l'avvento della piattaforma Java2, fornisce una ricco CRS4 - http://www.crs4.it insieme di classi per la gestione di collezioni di dati: – Vettori – Liste – Tabelle di hash – Insiemi ● L'accesso uniforme ai dati è ottenuto attraverso una istanza di Iterator Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 67. Domande? CRS4 - http://www.crs4.it Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 68. Bibliografia CRS4 - http://www.crs4.it ● Design Patterns Elements of Reusable Object-Oriented Software E. Gamma, R. Helm, R. Johnson, J. Vlissides Addison-Wesley, 1994 ISBN: 0201633612 Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 69. Conclusioni ● I DP sono la formalizzazione di buone soluzioni a problemi generali che possono CRS4 - http://www.crs4.it presentarsi nella progettazione/sviluppo di un software ● I DP forniscono una possibile soluzione ad una classe di problemi ● L'uso esagerato/sistematico dei DP puo' portare ad un peggioramento della qualita' del codice (non facciamo la classe String come Composite di caratteri e stringhe, a loro volta generati da una factory...) Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}
  • 70. Grazie... :-) CRS4 - http://www.crs4.it Davide Carboni - Stefano Sanna {dcarboni|gerda@crs4.it}