Design Patterns Introduzione Design patterns: factory, singleton, adapter, composite, decorator, observer Introduzione I Design Patterns sono stati applicati per la prima volta nell architettura Per costruire una casa non si parte dalle leggi fisiche, ma si utilizzano soluzioni già consolidate I Design Patterns cercano di applicare ad un nuovo problema una soluzione classica La soluzione classica è disponibile e può essere applicata senza troppi sforzi Introduzione 2 I Design Patterns vennero applicati per la prima nel campo dell informatica da Gamma, Helm, Vlissides e Johnson Un Design Pattern è formato da: Contesto in cui si presenta il problema che vogliamo risolvere classica per il problema che stiamo affrontando Introduzione 3 I Design Patterns vengono classificati in funzione del problema che risolvono Creazionali, creazione di oggetti Strutturali, organizzazione degli oggetti e loro composizione Comportamentali, come cambiare il comportamento dell applicazione con minime modifiche del codice
Design Patterns Creazionali Factory, Singleton Strutturali Adapter, Composite, Decorator Comportamentali Observer Osservazioni Non vengono presentati tutti i Design Patterns, ma solo quelli più conosciuti ed utilizzati Alcuni Design Patterns verranno definiti utilizzando interfacce. In questo caso, le interfacce potranno eventualmente essere sostituite da classi astratte. Factory : Voglio creare degli oggetti con caratteristiche comuni La creazione degli oggetti non deve essere controllata direttamente dall applicazione : L applicazione delega la creazione degli oggetti ad una classe detta Factory Factory - Esempio Un applicazione gestisce documenti I documenti possono essere di due tipi Solo testo Testo con figure I documenti esportano un interfaccia comune Quando l applicazione recupera un vecchio documento, delega la sua creazione a DocumentFactory DocumentFactory si occuperà di stabilire se il documento è solo testo o testo con figure e, di conseguenza, creerà il documento
Esempio Class Diagram Application Document DocumentFactoryInterface TextDocument FigureDocument DocumentFactory Singleton Una classe può essere istanziata solo una volta L applicazione utilizza questa istanza in diversi punti dell applicazione Ottengo la reference all oggetto tramite il metodo statico getinstance Il costruttore della classe è privato, quindi nessun oggetto può istanziare questa classe. L unica istanza di questa classe viene creata all interno di getinstance Esempio public class SingletonEsempio { private SingletonEsempio x; private SingletonEsempio() { public static SingletonEsempio getinstance() { if (x==null) { x= new SingletonEsempio(); return x; Adapter Voglio utilizzare la classe X già disponibile all interno della mia applicazione La classe X utilizza un interfaccia non compatibile con la mia applicazione Al posto di riscrivere o modifica la classe X, definisco una nuova classe, detta Adapter, che modifica l interfaccia esporta dalla classe X
Esempio La mia applicazione visualizza a video delle figure geometriche e del testo Le figure geometriche esportano la stessa interfaccia. L applicazione può accedere a queste figure sempre nello stesso modo Tradurre un testo come un immagine è un compito fatico Decido di utilizzare una classe che trasforma un testo in un immagine Questa classe però non esporta l interfaccia desiderata Definisco una classe, detta Adapter, che modifica l interfaccia esportata Esempio Class Diagram Shape Line Box TextViewAdapter TextView Composite -1 Un oggetto della mia applicazione può contenere al suo interno un numero indefinito di oggetti a lui simili. A sua volta, gli oggetti contenuti possono contenere altri oggetti La struttura degli oggetti cosi creata è ad albero Questa struttura può essere ripetuta infinite volte Quando invoco un operazione su un oggetto, voglio che questa sia invocata a cascata su tutti gli oggetti contenuti La struttura ad albero degli oggetti è dinamica e non statica Composite - 2 Tutti gli oggetti esportano la stessa interfaccia Quando viene chiamato un metodo su un oggetto, lo stesso metodo viene chiamato anche su tutti gli oggetti contenuti Individuo due tipi di oggetti: Composite, possono contenere altri oggetti Leaf, non possono contenere altri oggetti Leaf Component Composite
Esempio AWT di Java Component Label Button Container Add() Decorator Voglio aggiungere dinamicamente delle funzioni ad una classe con ereditarietà Ad ogni ereditarietà definisco una nuova funzione L ordine con cui vengono applicare le funzioni è cablato all interno del codice e non può essere modificato Decorator con Design Pattern Le funzionalità di una classe vengono estese in maniera trasparente usando una sotto classe che delega le proprie operazioni alla classe originaria ConcreateComponent ConcreateDecoratorA Component Decorator ConcreateDecoratorB Esempio InputStream Voglio applicare diverse funzioni ad un flusso di dati in ingresso Decriptazione Controllo sulla correttezza dei dati Bufferizzare i dati in ingresso La sorgente dei dati può essere di diverso tipo File Socket
Esempio Class Diagram Esempio FileInputStream ChiperInputStream InputStream FilterInputStream CheckedInputStream InputStream in; in = FileInputStream( c:/prova.txt ); in = new CheckedInputStream(in, ); in= new ChiperInputStream(in, ); in= new BufferedInputStream(in); BufferedInputStream Observer Voglio ricevere una notifica quando cambia un oggetto o un insieme di oggetti Definisco due classi astratte Observer è colui che osserva Observable è l oggetto osservato Quando un Observable viene modificato, chiama un metodo della classe Observer per notificare il cambiamento Esempio Trasferimento Canzoni Observer Observable update( ) add( ) Transfer Stream