Ricettario dei principali pattern GoF Docente: Gabriele Lombardi [email protected] © 2010 - CEFRIEL The present original document was produced by CEFRIEL and the Teacher for the benefit and internal use of this course, and nobody else may claim any right or paternity on it. No right to use the document for any purpose other than the Intended purpose and no right to distribute, disclose, release, furnish or disseminate it or a part of it in any way or form to anyone without the prior express written consent of CEFRIEL and the Teacher. © copyright Cefriel and the Teacher-Milan-Italy-23/06/2008. All rights reserved in accordance with rule of law and international agreements. © 2010 - CEFRIEL Sommario SLIDE CONTENUTO Creazionali Pattern di creazione di nuove istanze Strutturali Pattern di strutturazione dati/comunicazione Comportamentali Gestione del comportamento negli algoritmi © 2010 - CEFRIEL Creazionali: Singleton Scopo: – istanza singola di una classe (es.: registry); – rispetto a soli metodi statici permette di sfruttare polimorfismo e altri pattern creazionali (factory, …). Ingredienti: – costruttore privato (sparisce quello di default); – attributo statico privato per mantenere l’unica istanza; – factory method “getInstance” per lazy-evaluation. © 2010 - CEFRIEL Creazionali: Factory Method Scopo: – generazione di una istanza da metodo statico; – utilizzo di strutture dati statiche durante la creazione; • es.: per implementare il riciclo di istanze; Ingredienti: – costruttore privato (impedisce l’istanziazione diretta); – metodi statici di restituzione di istanze. © 2010 - CEFRIEL Creazionali: Abstract Factory Scopo: – disaccoppiare le classi che istanziano da quelle che scelgono e configurano le istanze; – eventualmente astrarre la natura delle istanze; Ingredienti: – – – – – classe target da istanziare; classe astratta con factory method non statico; classi concrete che implementano al factory; eventualmente costruttore superclasse factory; eventualmente gerarchia classe target. © 2010 - CEFRIEL Creazionali: Builder Scopo: – fornire uno strumento trasparente per la creazione di oggetti complessi (composti da più parti); Ingredienti: – classe composta e parti componenti; – classe builder con metodi di: – creazione delle parti; – creazione dell’istanza usando le parti precedenti; – eventuale hiding di costruttori e classi delle parti. © 2010 - CEFRIEL Creazionali: Prototype Scopo: – fornire un meccanismo per generare istanze da prototipi (es.: tramite loro clonazione); Ingredienti: – metodo di istanza per la generazione di un’altra istanza della stessa classe (o sottoclasse); – eventuale costruttore nascosto al client; – eventuali parametri aggiuntivi nel factory method. © 2010 - CEFRIEL Strutturali: Adapter Scopo: – adattare un’implementazione a una gerarchia diversa; – nascondere il reale implementor dell’operazione; Ingredienti: – – – – – gerarchia astrazione; classe adapter che implementante l’astrazione; istanza dell’implementor nell’adapter; operazioni delegate all’implementor; eventuale codice di adattamento semantico. © 2010 - CEFRIEL Strutturali: Composite Scopo: – comporre ad albero elementi semplici e composti; – si pensi a oggetti grafici e gruppi di oggetti grafici; Ingredienti: – gerarchia di astrazione; – classe aderente alla gerarchia composta con elementi della stessa (dell’interfaccia/superclasse astratta); – operazioni delegate agli elementi della composizione. © 2010 - CEFRIEL Strutturali: Decorator Scopo: – “decorare” il comportamento di una classe concreta; – rendere tale differenza trasparente al client; Ingredienti: – gerarchia di astrazione; – sottoclasse della classe da decorare (Leaf); – operazioni delegate alla superclasse concreta… – …successivamente modificate con codice aggiuntivo. © 2010 - CEFRIEL Strutturali: Facade Scopo: – mostrare un punto di accesso semplice a un pacchetto dalle operazioni complesse; – nascondere complessi dettagli di collaborazione; Ingredienti: – una classe che accede al contenuto del pacchetto; – operazioni semanticamente semplici orchestranti le classi presenti all’interno del pacchetto. © 2010 - CEFRIEL Comportamentali: Command Scopo: – isolare una funzionalità dai suoi punti di accesso; – astrarre il concetto di operazione eseguibile; Ingredienti: – classe astratta o interfaccia Command; – metodo astratto di esecuzione come contratto. © 2010 - CEFRIEL Comportamentali: Iterator Scopo: – iterare sugli elementi di una struttura dati senza conoscere i dettagli della struttura stessa; Ingredienti: – interfaccia di astrazione del concetto di iterazione; – astrazione di struttura dati che supporta l’iteratore; – strutture dati implementanti tale astrazione. © 2010 - CEFRIEL Comportamentali: Observer Scopo: – consentire l’astrazione della notifica di eventi; – disaccoppiare chi genera l’evento da chi lo riceve; Ingredienti: – interfaccia di notifica dell’evento (ricevente); – ascoltatori che la implementano; – classe di generazione degli aggiornamenti. © 2010 - CEFRIEL Comportamentali: Template Method Scopo: – creare una gerarchia di classi in cui varia solamente una funzionalità, senza dover replicare codice; – astrarre una parte di una classe usata da sé stessa; Ingredienti: – classe astratta con metodo astratto (protetto); – sottoclassi implementanti quel metodo. © 2010 - CEFRIEL Comportamentali: Strategy Scopo: – astrarre un algoritmo facendo sì la sua scelta avvenga a run-time (criteri vari, es.: efficienza); Ingredienti: – interfaccia/classe astratta rappresentante l’algoritmo; – classi implementanti in concreto l’algoritmo stesso. © 2010 - CEFRIEL Da qui? Abbiamo visto solamente un assaggio: – i design pattern GoF non sono solo questi; – molti altri design pattern esistono in letteratura; – costruire architetture usando i design pattern richiede esperienza oltre che profonda comprensione; – esistono altri strumenti come smell e antipattern; – tecniche di refactoring vengono utilizzate per trasformare un’architettura in un’altra migliore. Letteratura? – Design Patterns della Gang of Four; – Refactoring di Fowler; – Patterns of Enterprise Applications Architecture, Fowler. © 2010 - CEFRIEL