L.Lista, V. Innocente Design P atterns Luca Lista, Vincenzo Innocente
L.Lista, V. Innocente Design Patterns “Elementi di software OO riutilizzabile” Piccoli insiemi di classi che collaborano implementando dei comportamenti tipici –Creational patterns –Structural patterns –Behavioral patterns Alcuni pattern classici stanno diventanto obsoleti grazie al supporto dei Template E. Gamma et al., Design Patterns
L.Lista, V. Innocente Factory I client possono richiedere la creazione di un prodotto senza dipendervi. La Factory dipende dai prodotti concreti, mentre i client dipendono solo AbstractProduct.
L.Lista, V. Innocente Singleton Il Singleton pattern piò essere usato ogni volta che una classe deve essere instanziata una sola volta, e viene usata da diversi oggetti. Per evitare istanziazione accidentale, il constructor deve essere privato. Più istanze, ma in numero ben determinato, possono esistere (multiton) Siccome vengono usate funzioni statiche, l’ereditarietà non può essere applicata. user_code() { Singleton::instance()->specificService(...); } user_code() { Singleton::instance()->specificService(...); }
L.Lista, V. Innocente Template Singleton Un Template Singleton può essere specializzato usando la classe stessa come argomento del template. Se V ha un constructor privato, Singleton deve essere friend di V (non tutti i compilatori lo supportano…). T class V : public Singleton { public: specificService(...); private: V(); friend class Singleton ; }; user_code() { V::instance()->specificService(...); } class V : public Singleton { public: specificService(...); private: V(); friend class Singleton ; }; user_code() { V::instance()->specificService(...); }
L.Lista, V. Innocente Proxy Una richiesta da un client a un server, può essere mediata dal Proxy, che può compiere anche altre operazioni (I/O, caching, etc.)
L.Lista, V. Innocente Composite Il client può trattare componenti e compositi usando la stessa interfaccia. La composizione può essere recursiva. Esempio: programmi di grafica vettoriale
L.Lista, V. Innocente Composite Shape Cerchio, Rettangolo,... draw( ) Shape draw( ) Gruppo draw( ) 1..* Client for c in all _children c->draw(); _children Nel nostro esempio di grafica con Shapes un gruppo può essere considerato un composito e le varie classi concrete sono le leaves.
L.Lista, V. Innocente Collection e Iterator Un iteratore permette più iterazioni indipendenti sulla stessa collezione. Questo sarebbe stato impossibile se l’iterazione fosse stato un servizio della collezione. Oggi, sia Collection che Iterator sono implementati come template classes (collezione “non intrusiva”).
L.Lista, V. Innocente Strategy Il pattern Strategy permette di scegliere l’algoritmo da eseguire a run-time. Nuovi algoritmi possono essere introdotti senza modificare i client.
L.Lista, V. Innocente Observer Lo stato dell’ Observer dipende dallo stato del Subject. Il Subject notifica a tutti gli Observer registrati che il suo stato è cambiato.
L.Lista, V. Innocente Template Method Un Template Method è un modo di garantire un comportamento comune. Le operazioni elementari sono delegate alle sottoclassi.
L.Lista, V. Innocente Visitor Permette di aggiungere nuove operazioni a Element senza modificarne l’interfaccia. Per aggiungere nuovi ConcreteElement, bisogna modificare tutti i Visitor s.