Design Patterns - Unicamdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:...Pattern...
Transcript of Design Patterns - Unicamdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:...Pattern...
Design Patterns
Andrea Polini
Ingegneria del SoftwareCorso di Laurea in Informatica
(Ingegneria del Software) Design Patterns 1 / 78
Riuso
Sommario
1 Riuso
2 Approcci
(Ingegneria del Software) Design Patterns 2 / 78
Riuso
Riuso - generalità
Riuso tipico approccio ingegneristico alla costruzione di sistemi.Sistemi risultano da integrazione di sottosistemi spesso non “banali”.
Motivazioni e benefici legati al riuso:ridotti costi di sviluppo,sviluppo da parte di specialisti,ridotti tempi di rilascio,aumentata qualità del softwareridotto rischio del processo,
(Ingegneria del Software) Design Patterns 3 / 78
Riuso
Riuso e tipiche problematiche
Problematiche tipiche nel riuso del software:Incremento nei costi di gestione del sistemaMancanza di strumenti di supporto al riusoSindome del “NIH”Gestione di libreria di componentiIntegrazione ed adattamento di componenti
(Ingegneria del Software) Design Patterns 4 / 78
Riuso
Riuso - generalità
Riuso può interessare manufatti ma anche riuso a livello concettuale
Riuso di manufatti:Riuso di intere applicazioniRiuso di componenti e sottosistemiRiuso di oggetti e librerie
(Ingegneria del Software) Design Patterns 5 / 78
Approcci
Sommario
1 Riuso
2 Approcci
(Ingegneria del Software) Design Patterns 6 / 78
Approcci
Riuso - una panoramica
(Ingegneria del Software) Design Patterns 7 / 78
Approcci
Quale approccio?
Fattori che possono guidare nella scelta di un approccio piuttosto cheun’altro:
Tempistiche dello sviluppoAttesa longevità dell’applicazioneConoscenze e capacità del team di sviluppoCaratteristiche di criticità del softwareDominio applicativoPiattaforma di esecuzione
(Ingegneria del Software) Design Patterns 8 / 78
Approcci
Design PatternsDefinizione: un pattern descrive un problema che ricorre spesso e proponeuna possibile soluzione in termini di organizzazione di classi/oggetti chegeneralmente si è rilevata efficace a risolvere il problema stesso.
Design Pattern sono caratterizzati da quattro elementi principali:
Nome - riferimento mnemonico che permette di aumentare il vocabolariodei termini tecnici e ci permette di identificare il problema e la soluzionein una o due parole
Problema - descrizione del problema e del contesto a cui il patternintende fornire una soluzione
Soluzione - descrive gli elementi fondamentali che costituiscono lasoluzione e le relazioni che intercorrono tra questi
Conseguenze - specifica le possibili conseguenze che l’applicazionedella soluzione proposta può comportare. Si riferiscono ad esempio apossibili problemi di spazio o efficienza della soluzione, oppure adapplicabilità con specifici linguaggi di programmazione
(Ingegneria del Software) Design Patterns 9 / 78
Approcci
Design Patterns e documentazione
Una volta ben definito e generalmente accettato da una communità disviluppatori il pattern diventa anche un’ottimo strumento perdocumentare il software.
Esistono esempi di applicazioni interamente descritte attraverso l’usodi design pattern (e.g. JUnit)
Testo di Riferimento:Erich Gamma, Richard Helm, Ralph Johnson, John VlissidesDesign Pattern: elements of reusable Object Oriented softwareAddison Wesley
Materiale di studio a:http://it.wikipedia.org/wiki/Design_pattern
(Ingegneria del Software) Design Patterns 10 / 78
Approcci
Design Patternperché è una soluzione efficace?
Si riferisce ad un riuso di un’attività di progettazione dunque:
Aspetto Economico: riduce i tempi ed i costi di progetto dei singolimoduliAspetto Tecnico: riduce i rischi di progetto e possibilità di errori nelprogetto stesso. Soluzione attuata e riutilizzata più volte e di cui sipossono prevedere le caratteristiche a priori (e.g. comportamentonon-funzionale)Aspetto Antropologico: semplifica la comprensione del progettoda parte di terzi fornendo livello di astrazione più chiaro
(Ingegneria del Software) Design Patterns 11 / 78
Approcci
Come definire un pattern in modo da facilitarne il riusoDescrizione dei Design Pattern secondo la GoF
La definizione di collezioni di pattern in uno specifico dominio applicativosono il primo passo per poter stabilire un contesto di riusoNel libro della GoF i pattern sono descritti attraverso i seguenti punti:
Nome: sintetizza l’essenza del pattern. Obiettivo è ampliare il vocabolario diprogetto.
Intento: Descrizione che cerca di rispondere alla domanda “cosa fa il DP?” “Aquale problama di progettazione si rivolge?”
Aka (Also known as): eventuali altri nomi che identificano il pattern
Motivazioni: Scenario che illustra il problema e come il pattern fornisce unasoluzione
Applicabilità: situazioni di applicabilità e come poter riconoscere tali situazioni
(Ingegneria del Software) Design Patterns 12 / 78
Approcci
Come definire un pattern in modo da facilitarne il riusoDescrizione dei Design Pattern secondo la GoF
Struttura: rappresentazione grafica tramite UML delle classi coinvolte edelle loro relazioni
Partecipanti: classi che partecipano al pattern, loro relazioni eresponsabilità (class diagram, object ed activity diagram)Collaborazioni: Come collaborano le varie classi per raggiungere gliobiettivi (sequence diagram)
Conseguenze: vantaggi e svantaggi dell’uso del pattern e possibili effetticollaterali nell’uso del pattern
Implementazione: tecniche che e suggerimenti per l’implementazionecon riferimento anche a specifici linguaggi di programmazione
Codice sorgente di esempio: frammenti di codice che forniscono unaguida per l’implementazione
Usi noti: esempi di uso in sistemi esistenti
Patterns correlati: differenze e relazioni più importanti con altri pattern.Tipico uso concomitante.
(Ingegneria del Software) Design Patterns 13 / 78
Approcci
Classificazione dei Pattern
Elenco di pattern può essere corposo (GoF ha definito 23 pattern generali)risulta importante cercare di identificare caratteristiche per la loroclassificazione. Ciò semplifica anche lo studio e la comprensione dei patternstessi. Sono stati idendificati due criteri principali:
A cosa si riferisce il pattern
Oggetti: relazioni fra oggetti che possono modificarsi a tempo diesecuzioneClassi: riguardano relazioni tra classi e sottoclassi
Cosa fa il pattern (scopo)
Creazionali: riguarda il processo di creazione di oggettiStrutturali: riguarda la composizione di classi e di oggettiComportamentali: definisce come classi e oggetti interagiscono edistribuiscono fra loro delle responsabilità
Certamente è possibile classificarli secondo altri criteri
(Ingegneria del Software) Design Patterns 14 / 78
Approcci
Object vs. Class pattern
Pattern creazionali di classe risolvono il problema della creazione dioggetti attraverso la delega a sottoclassi.Per contro pattern di oggetti creazionali risolvono il problemaattraverso la definizione di specifiche interazioni tra oggetti.
Pattern comportamentali di classe usano ereditarietà per definirealgoritmi e flussi di controllo.Per contro i pattern di oggetti comportamentali definiscono interazionitra oggetti che permettono di svolgere una determinata attività
(Ingegneria del Software) Design Patterns 15 / 78
Approcci
GoF classificazione
(Ingegneria del Software) Design Patterns 16 / 78
Approcci
In che modo i DP contribuiscono a semplificare laprogettazione
Identificare gli oggetti necessari: scomporre sistema in oggetti è compitodifficile. Pattern aiutano nell’identificazione di oggetti che rappresentanoastrazioni non banali a partire dalla definizione del problema che sivuole risolvere.
Determinare granularità degli oggetti: l’applicazione di un pattern portacon se scelte riguardanti la granularità. Ci sono pattern che permettonodi definire oggetti come composizione di oggetti più semplici oppurepattern che permettono di rappresentare sottosistemi completi consemplici oggetti
Definizione delle interfacce: l’applicazione di un pattern porta con se lescelte riguardanti le interfacce ed i meccanismi di interazione tra glioggetti
Definire implementazione: applicare un pattern comporta specifichescelte implementative. In particolare vi sono pattern che si focalizzanosu ereditarietà mentre altri si focalizzano su meccanismi di composizione
(Ingegneria del Software) Design Patterns 17 / 78
Approcci
Pattern Creazionali
(Ingegneria del Software) Design Patterns 18 / 78
Approcci
DP creazionali
Astraggono il meccanismo di generazione di istanze di una classe conl’obiettivo di rendere il sistema indipendente da come i suoi oggetti sonocreati, composti, e rappresentati. La creazione degli oggetti viene tipicamentegestita da apposite “strutture”.
Un DP creazionale che opera su classi userà ereditarietà per definire laclasse da instanziare. Mentre DP che operano su oggetti userannomeccanismi di delega.
In generale semplificano la composizione di classi e la favoriscono rispettoall’uso dell’ereditarietà.
I pattern creazionali forniscono molta flessibilità nel cosa, il come, il chi ed ilquando della creazione di oggetti
(Ingegneria del Software) Design Patterns 19 / 78
Approcci
Factory Method
Scopo: fornire un meccanismo per la creazione di oggetti simili(e.g. che implementano la stessa interfaccia) senza specificarequali siano le loro classi concreteMotivazione: si ha bisogno di determinare l’esatto tipo dell’oggettoda instanziare solo a run-timeSinonimi: Virtual ConstructorApplicabilità:
sistema deve essere indipendente dalle modalità di creazione,composizione e rappresentazione dei suoi prodottisi vuole una libreria (i.e. insieme di classi) che esponga soltantol’interfaccia e non la sua implementazione
(Ingegneria del Software) Design Patterns 20 / 78
Approcci
Factory Method - Struttura
(Ingegneria del Software) Design Patterns 21 / 78
Approcci
Factory Method
Conseguenze:isola classi concreteconsente di cambiare in modo semplice l’implementazione ed in comportamentiesposti da un insieme di prodottipromuove il riuso di prodotti/artefatti/codiceaggiunta e supporto di nuovi di prodotti semplice
Partecipanti:Factory (Factory) dichiara ed implementa i meccanismi di creazione per uninsieme oggetti simili (e.g. che condividono la stessa interfaccia)AbstractProduct (ProductBase) dichiara un’interfaccia (i.e. classe astratta ointerface) per una tipologia di oggetti prodottoConcreteProduct (ConcreteProductA, ConcreteProductB,ConcreteProductC) definisce un oggetto prodotto che dovrà essere creato dallacorrispondente factory implementa l’interfaccia definita da AbstractProductClient (Client) crea istanze di ConcreteProduct attraveso la Factory utilizzasoltanto l’interfaccia dichiarate in AbstractProduct
(Ingegneria del Software) Design Patterns 22 / 78
Approcci
Abstract Factory
Ulteriori informazioni:http://it.wikipedia.org/wiki/Abstract_factory
Scopo: definire un’interfaccia per la creazione di famiglie di oggetticorrelati o dipendenti senza specificare quali siano le classi concrete.
Motivazione: spesso ci si trova di fronte al problema di voler istanziareun oggetto senza specificare precisamente la classe. Comportamentochiaramente non possibile con meccanismi di creazione tipo new. Casotipico delle interfacce grafiche e delle interfacce che mantengonocoerenza con il tema in uso.
Applicabilità: utilizzato quando:
sistema indipendente dalle modalità di creazione, composizione;sistema configurabile dipendentemente dalle caratteristiche di unatra piú tipologie di oggettolibreria di classi fornendo solo interfaccia ma non implementazionispecifiche
(Ingegneria del Software) Design Patterns 23 / 78
Approcci
Abstract Factory
Conseguenze:
isolamento delle classi concrete. Gli oggetti non contengonodettagli che si riferiscono ai meccanismi di creazione degli oggetti.La creazione di un particolare oggetto è visto come un normaleservizio fornito da classi preposte allo scopo.Risulta semplice la modifica/aggiunta di classi rappresentantifactory concrete. L’uso di queste risulta estremamente localizzato.Dunque prodotti diversi si ottengono modificando la factory.Il supporto a nuove tipologie di prodotto che richiederebbero dimodificare l’abstract factory risulta complessa in quanto richiede dimodificare tutte le classi concrete.
(Ingegneria del Software) Design Patterns 24 / 78
Approcci
Abstract Factory
Struttura:
(Ingegneria del Software) Design Patterns 25 / 78
Approcci
Abstract Factory
Partecipanti:
AbstractFactory : Dichiara un’interfaccia per le operazioni dicreazione di oggetti astrattiConcreteFactory : implementa le operazioni di creazione di oggetticoncretiAbstractProduct : Dichiara un’interfaccia per una tipologia dioggettiConcreteProduct : definisce un oggetto che dovrà essere creatodalla corrispondente factory concretaClient : utilizza soltanto le interfacce dichiarate sopra
Collaborazioni:
spesso esiste una sola istanza di una ConcreteFactory a run-timeper le diverse tipologieLa classe AbstractFactory delega la creazione di oggetti alle suesottoclassi.
(Ingegneria del Software) Design Patterns 26 / 78
Approcci
Abstract Factory
Implementazione: . . .
Utilizzi noti: . . .
Pattern correlati: associato ad altri pattern creazionali in particolare alSingleton per avere classi concrete che non ammettono istanze multiple.
(Ingegneria del Software) Design Patterns 27 / 78
Approcci
Builder
Scopo: Separare la costruzione di un oggetto complesso dallasua rappresentazione in modo che lo stesso processo dicostruzione possa generare differenti rappresentazioni.Motivazione: Si immagini un generatore di profili per un gioco diruolo. Il modo più semplice di popolare il sistema è permettere alcomputer di creare i profili. Ma se si volesse selezionare alcunecaratteristiche quali professione, genere, colore dei capelli, etc. lagenerazione diventa un processo passo-passo che terminaquando tutte le caratteristiche sono state selezionate. Il Builderpattern permette di creare differenti caratteri di un oggettoevitando il problema del “constructor pollution”.
(Ingegneria del Software) Design Patterns 28 / 78
Approcci
Builder - Struttura
(Ingegneria del Software) Design Patterns 29 / 78
Approcci
Builder
Applicabilità:
da usare quando algoritmo di creazione di oggetto complesso deveessere reso indipendente dalle partiprocesso di creazione diverso dalla rappresentazione
Partecipanti:
Director (Director): costruisce l’oggetto usando algoritmicomplessi e l’interfaccia di builder.Builder (Builder): specifica un’interfaccia (classe astratta) per lacostruzione di parti di oggetti complessiConcreteBuilder (ThiefBuilder, WarriorBuilder,MageBuilder): fornisce un interfaccia per la costruzione delprodotto semplificandone gli aspetti. Fornisce un’interfaccia perrecuperare oggetto creato.Product (Hero): prodotto complesso che deve essere creato
(Ingegneria del Software) Design Patterns 30 / 78
Approcci
Builder
Conseguenze:
Isola il codice di costruzione da quello di rappresentazionecontrollo più fine sul processo di costruzionepiù facile cambiare la rappresentazione interna degli oggetti
Utilizzi noti:
java.lang.StringBuilderjava.nio.ByteBuffer as well as similar buffers such as FloatBuffer,IntBuffer and so on.java.lang.StringBufferAll implementations of java.lang.AppendableApache Camel buildersApache Commons Option.Builder
Pattern correlati: . . . .
(Ingegneria del Software) Design Patterns 31 / 78
Approcci
Prototype
Scopo: Permette di specificare oggetti a partire da un prototipo che può esserepoi dettagliato
Motivazione: Si vogliono realizzare artefatti complessi a partire da frameworkgenerali per quel contesto. Ad esempio costruire editor di modellazione perspecifiche notazioni riusando meta-modelli definiti per la notazione.
Sinonimi:
Applicabilità: quando il sistema deve essere indipendente da come è prodotto,creato, e rappresentato:
quando le classi da istanziare sono create a run-time (dynamicloading)evitare di costruire gerarchie di classi “factory” che rappresentanoparallelamente la gerarchia delle classiquando le istanze della classe possono avere poche differenticombinazioni di stato, è più conveniente usare prototipi piuttostoche creare classi manualmentequando processo di creazione è costoso rispetto al cloning.
(Ingegneria del Software) Design Patterns 32 / 78
Approcci
Prototype - Struttura
(Ingegneria del Software) Design Patterns 33 / 78
Approcci
Prototype
Conseguenze: Come per altri pattern nasconde il prodotto concreto dalclient riducendo il numero di “nomi” conosciuti allo stesso.
Aggiunta rimozione di prodotti a run-time più facilespecifica di nuovi oggetti variando soltanto alcuni valorispecifica di nuovi oggetti variando la strutturaridotto subclassingconfigurare applicazione configurando dinamicamente le classi
Partecipanti:
Prototype: dichiara interfaccia per cloningConcretePrototype: implementa operazione di cloningClient : crea un nuovo oggetto richiedendo cloning
(Ingegneria del Software) Design Patterns 34 / 78
Approcci
Prototype
Implementazione:
uso di un prototype manageroperazione di “clone”inizializzazione dei cloni
Java include interfaccia generale per cloning “java.lang.Cloneable”.Attenzione a gestione di riferimenti condivisi in oggetti complessi.
Utilizzi noti: . . .
Pattern correlati: una “Abstract Factory” potrebbe usare prototipi per percreare oggetti. Il prototipo potrebbe essere utile per pattern quali“Composite” e “Decorator”
Approfondimenti:https://refactoring.guru/design-patterns/prototype/java/example
(Ingegneria del Software) Design Patterns 35 / 78
Approcci
SingletonUlteriori informazioni:http://it.wikipedia.org/wiki/Singleton
Scopo: Fare in modo che a run-time esista al più una sola istanza di unaclasse e fornire un punto globale di accesso a tale istanza
Motivazione: É spesso importante avere una sola istanza di una classea run-time. Si consideri ad esempio il caso del File System Manager odel Window Manager di un sistema. (Kdm o Gdm per chi usa Linux).Dunque come possiamo fare in modo da garantire che a run-time nonsia possibile avere più istanze di una stessa classe e che tale istanze siafacilmente accessibile ai potenziali utilizzatori?
Applicabilità: il pattern singleton puè essere usato quando:
deve esistere una sola istanza di una classe e punto di accessonoto agli utilizzatoriquando l’unica istanza deve poter essere estesa attraversodefinizione di sottoclassi ed i client non devono essere modificaticome conseguenza di ciò
(Ingegneria del Software) Design Patterns 36 / 78
Approcci
Singleton
Conseguenze: controllo degli accessi all’istanza, spazio dei nomi ridotto,possibilità di estensione ad aver un numero n di istanze, facilemanutenzione
Struttura:
Partecipanti:
Singleton: definisce un’operazione getInstance che permette aiclient di accedere all’unica istanza disponibile della classe. La dettaoperazione deve essere un’operazione di classe ovvero in Javadovrà essere marcata dalla parola chiave static
(Ingegneria del Software) Design Patterns 37 / 78
Approcci
Singleton
Collaborazioni: I client possono accedere ad un’istanza di singletonsoltanto invocando l’operazione getInstance
Conseguenze: Il pattern Singleton offre importanti benefici:Accesso controllato ad un’unica istanzaRiduzione dello spazio dei nomiRaffinamento delle operazioni e della rappresentazione internaGestione di un numero variabile di istanze
Implementazione: si possono fare alcune considerazioni sui differentimeccanismi messi a disposizione dai differenti linguaggi OO per ladefinizione di operazioni di classe o per altri meccanismi che possonoinfluenzare l’implementazione con un dato linguaggio.
Utilizzi noti: . . .
Pattern correlati: altri pattern creazionali potrebbero usare il patternsingleton per esempio per risolvere gli specifici problemi “creazionali”associandoli alla necessità di avere una sola istanza.
(Ingegneria del Software) Design Patterns 38 / 78
Approcci
Combinazioni e concorrenza
Come si comportano le classi singleton in presenza di clienticoncorrenti?Come combinare Abstract Facotry e Singleton?
(Ingegneria del Software) Design Patterns 39 / 78
Approcci
Pattern Strutturali
(Ingegneria del Software) Design Patterns 40 / 78
Approcci
Pattern Strutturali
I pattern strutturali descrivono come comporre oggetti o classi percreare e riutilizzare strutture complesse fornendo interfacce più adatteall’uso da parte di oggetti client.
basati su classi: utilizzano l’ereditarietà per comporre interfacce oimplementazioni esempio: ereditarietà multipla combina due o piùclassi per ottenere una classe con tutte le proprietà dellesuperclassibasati su oggetti: modellano le modalità di composizione di oggettiper realizzare nuove funzionalità hanno maggiore flessibilitàpoiché è possibile cambiare la composizione durante l’esecuzione
(Ingegneria del Software) Design Patterns 41 / 78
Approcci
Adapter
Scopo:gestire interfacce incompatibilifornire un’interfaccia stabile a classi funzionalmente simili o con interfacce diverse
Motivazione: spesso le classi di un sistema vengono strutturate/progettate cercando dioffrire un profilo riusabile. Tuttavia, può capitare che queste classi non possono essereeffettivamente riusate; per esempio perchè la loro interfaccia offerta non rispecchiaesattamente i requisiti (o la segnatura) richiesti di uno specifico dominio
Sinonimi: Wrapper
Applicabilità:si vuole utilizzare una classe esistente ma la sua interfaccia non è compatibile conquella che servesi vuole realizzare una classe riusabile che coopera con altre classi anche sescorrelate o impreviste e con una interfaccia eventualmente incompatibile
(Ingegneria del Software) Design Patterns 42 / 78
Approcci
Adapter - Struttura
(Ingegneria del Software) Design Patterns 43 / 78
Approcci
Adapter
Conseguenze:
adatta Adaptee a Target attraverso la classe concreta Adapter; laclasse Adapter non è indicata se si volesse gestire l’adattamento diuna classe ma anche tutte le sue sotto-classiquanto “lavoro” deve fare la classe Adapter? dipende da quantosono simili le interfacce Target ed Adaptee.l’uso del pattern non è sempre trasparente ai Client
Partecipanti:
Target : definisce l’interfaccia di dominio con il clientClient : coopera con oggetti conformi all’interfaccia TargetAdaptee: definisce l’interfaccia esistente da adattareAdapter : realizza il meccanismo di adattamento
(Ingegneria del Software) Design Patterns 44 / 78
Approcci
Adapter
Implementazione: . . .
Utilizzi noti: . . .
Pattern correlati: . . . .
(Ingegneria del Software) Design Patterns 45 / 78
Approcci
Decorator
Scopo: aggiungere dinamicamente responsabilità ad un oggetto. I decoratori fornisconoun’alternativa flessibile alla definizione di sottoclassi come strumento per l’estensione dellefunzionalità
Motivazione:
GUI toolkit dovrebbe consentire di aggiungere proprietà come bordi, scorrimento, aisingoli elementi grafici il modo per aggiungere responsabilità è tramite ereditarietà
estendere una classe e aggiungere il bordodefinire un approccio flessibile che consenta di racchiudere il componente da“decorare” in un altro che abbia la sola responsabilità di aggiungere ilbordo/scrollbar/etc oggetto contenitore detto decorator decorator ha un’interfacciaconforme all’oggetto decorato in modo tale da essere trasparente ai vari clientdecorator trasferisce le richieste al componente decorato effettuando azioniaggiuntive (esempio decorando il bordo) prima o dopo il trasferimento della richiestaessendo trasparente ai client è possibile annidare i decorator consentendol’aggiunta di un numero illimitato di responsabilità agli oggetti decorati
Sinonimi: Wrapper
(Ingegneria del Software) Design Patterns 46 / 78
Approcci
Decorator - Struttura
(Ingegneria del Software) Design Patterns 47 / 78
Approcci
Decorator
Applicabilità:si vuole poter aggiungere responsabilità a singoli oggetti dinamicamente ed in modotrasparente, senza coinvolgere altri oggettisi vuole poter togliere responsabilità agli oggettil’estensione diretta attraverso le definizione di sottoclassi non è praticabile
esplosione di sottoclassi per supportare ogni possibile combinazione
Conseguenze:
maggiore flessibilità rispetto all’utilizzo dell’ereditarietà (multipla) staticaresponsabilità possono essere aggiunte e rimosse in esecuzionesemplicemente collegando e scollegando i decoratori agli oggetti decoratiin caso di ereditarietà è necessario creare una nuova classe per ogniresponsabilità (es. BorderedScrollableTextView, BorderedTextView)
consente di evitare di definire classi troppo complesse nella gerarchia
(Ingegneria del Software) Design Patterns 48 / 78
Approcci
Decorator
Partecipanti:
Component (VisualComponent): definisce l’interfaccia comuneper gli oggetti ai quali possono essere aggiunte responsabilitàdinamicamenteConcreteComponent (TextView): definisce un oggetto al qualepossono essere aggiunte responsabilità ulterioriDecorator: mantiene un riferimento ad un oggetto Component edefinisce un’interfaccia conforme all’interfaccia di ComponentConcreteDecorator (BorderDecorator, ScrollDecorator):aggiunge responsabilità al componente
Implementazione: . . .
Utilizzi noti: . . .
Pattern correlati: . . . .
(Ingegneria del Software) Design Patterns 49 / 78
Approcci
Façade
Scopo: fornire una interfaccia unificata ad un insieme di interfaccedi un sottosistemaMotivazione:
è richiesta un’interfaccia comune ed unificata per un insiemedisparato di implementazioni (i.e. classi o interfacce), come se sistesse identificando un sottosistemaminimizzare le comunicazioni e le dipendenze tra sottosistemimascherare l’implementazione di un sottosistema
l’implementazione può cambiare nel tempo ma non le funzionalitàofferte
idea
(Ingegneria del Software) Design Patterns 50 / 78
Approcci
Façade - Struttura
(Ingegneria del Software) Design Patterns 51 / 78
Approcci
Façade
Applicabilità:progettazione architetturale di un sistemafornire una interfaccia ad un sistema complesso o che evolve nel tempoaumentare il grado di riuso di un sottosistemastratificare un sistema identificando i punti di accesso ad ogni sottosistemaci sono molte dipendenze tra l’implementazione del sottosistema ed i suoi clientun client per realizzare una singola operazione logica deve accedere a più classi delsottosistema molto differenti tra loro
Partecipanti:
System: definisce un sistema del quale si vuole nascondere i dettagli implementativiall’esternoSubSystem (SystemA, SystemB, SystemC): definisce eventuali sottomoduli delsistemaFaçade (Façade1, Façade2): definisce l’interfaccia comune per l’accesso allefunzionalità del sistema può implementare logiche composizionali per esportarefunzionalità di sistemaClient (Client1, Client2): utilizzatore delle funzionalità del sistema
(Ingegneria del Software) Design Patterns 52 / 78
Approcci
Façade
Conseguenze:riduce il numero di oggetti che un client deve gestirerende il sistema più riusabileriduce il grado di accoppiamento tra un sistema ed i suoi client, mitigando laripercussione delle modifiche sul sistema anche sui clientla strutturazione in livelli consente di progettare sistemi indipendenti, con un bassotasso di dipendenze circolari
Implementazione: . . .
Utilizzi noti: . . .
Pattern correlati: . . . .
(Ingegneria del Software) Design Patterns 53 / 78
Approcci
ProxyUlteriori informazioni:http://it.wikipedia.org/wiki/Proxy_pattern
Scopo: fornire un surrogato o un segnaposto per un altro oggetto al finedi controllare l’accesso all’oggetto stesso. Allo stesso tempo può essereutile per rimandare la creazione di un oggetto ad un momentosuccessivo al fine di ridurre uso di risorse.
Motivazione: motivo può essere differire il costo di creazione edinizializzazione dell’oggetto ad un momento successivo quando questoè effettivamente necessario
Applicabilità: il pattern proxy puè essere usato secondo diversetipologie:
remote proxy: fornisce rappresentazione locale per un oggettoresidente in un diverso spazio di indirizzamentovirtual proxy: gestisce su richiesta la creazione di oggetti costosiprotection proxy: controlla l’accesso ad un oggetto. Si rivela utilequando possone esserci diversi diritti di accesso allo stessooggetto.smart reference: sostituisce quello che è un puntatore puro con unpuntatore dalle funzionalità aggiutive quando si accede all’oggettoreferenziato
(Ingegneria del Software) Design Patterns 54 / 78
Approcci
Proxy - Struttura
(Ingegneria del Software) Design Patterns 55 / 78
Approcci
Proxy
Conseguenze:
introduce un livello di indirezione nell’accesso ad un oggetto. Ingenerale operazioni molto complesse possono portare a degrado.disaccoppiano cliente e oggetto stesso ottimizzando l’uso dellerisorse rimandando solo al momento necessario l’esecuzione dioperazioni potenzialmente costose.
Partecipanti:
Proxy : mantiene un riferimento che consente al proxy di accedereall’oggetto rappresentato. Proxy deve implementare la stessainterfaccia del referenziato al fine di nascondere la propriapresenza al clienteSubject : definisce l’interfaccia comune per l’oggetto referenziatoed il proxy. Il proxy può sempre essere usato dove è richiestol’oggetto referenziato.RealSubject : caratterizza l’oggetto referenziato dal proxy
(Ingegneria del Software) Design Patterns 56 / 78
Approcci
Proxy
Implementazione: . . .
Utilizzi noti: . . .
Pattern correlati: . . . .
Caratterizzazioni importanti che comunque nel nostro studio non verrannoapprofondite.
(Ingegneria del Software) Design Patterns 57 / 78
Approcci
Bridge
Scopo: Dividere classi o famiglie di classi correlate in duegerarchie, astrazione e implementazione, che possono cosìessere sviluppate indipendentementeMotivazione:
Sinonimi: Handle, Body
(Ingegneria del Software) Design Patterns 58 / 78
Approcci
Bridge idea
(Ingegneria del Software) Design Patterns 59 / 78
Approcci
Bridge - Struttura e codice di esempio
(Ingegneria del Software) Design Patterns 60 / 78
Approcci
Bridge
Conseguenze:
Disaccoppiamento di aspetti differenti di un oggettoMaggiore flessibilità ed Estendiblitàmaggiore “hiding” di dettagli implementativi
(Ingegneria del Software) Design Patterns 61 / 78
Approcci
Bridge
Implementazione: . . .
Utilizzi noti: . . .
Pattern correlati: Adapter, Strategy, State, Abstract Factory
(Ingegneria del Software) Design Patterns 62 / 78
Approcci
Composite
https://refactoring.guru/design-patterns/composite
(Ingegneria del Software) Design Patterns 63 / 78
Approcci
Flyweight
https://refactoring.guru/design-patterns/flyweight
(Ingegneria del Software) Design Patterns 64 / 78
Approcci
Pattern Comportamentali
(Ingegneria del Software) Design Patterns 65 / 78
Approcci
Pattern Comportamentali
I pattern comportamentali hanno a che fare con gli algoritmi e gliassegnamenti di responsabilità tra gli oggetti. Caratterizzano sistemi dicontrollo complessi.
(Ingegneria del Software) Design Patterns 66 / 78
Approcci
Chain of Responsibility
https://refactoring.guru/design-patterns/chain-of-responsibility
(Ingegneria del Software) Design Patterns 67 / 78
Approcci
Command
https://refactoring.guru/design-patterns/command
(Ingegneria del Software) Design Patterns 68 / 78
Approcci
Mediator
https://refactoring.guru/design-patterns/mediator
(Ingegneria del Software) Design Patterns 69 / 78
Approcci
Memento
https://refactoring.guru/design-patterns/memento
(Ingegneria del Software) Design Patterns 70 / 78
Approcci
Observer
https://refactoring.guru/design-patterns/observer
(Ingegneria del Software) Design Patterns 71 / 78
Approcci
State
https://refactoring.guru/design-patterns/state
(Ingegneria del Software) Design Patterns 72 / 78
Approcci
Strategy
https://refactoring.guru/design-patterns/strategy
(Ingegneria del Software) Design Patterns 73 / 78
Approcci
Visitor
https://refactoring.guru/design-patterns/visitor
(Ingegneria del Software) Design Patterns 74 / 78