...

Sistemi Informativi

by user

on
Category: Documents
7

views

Report

Comments

Transcript

Sistemi Informativi
Corso di Laurea Triennale in Ingegneria Informatica
Corso di Sistemi Informativi
A. A. 2004 - 2005
Design pattern
1
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Scopo
• Usare soluzioni già pronte (Riuso)
• Organizzare l’esperienza nella progettazione di software
a oggetti sotto forma di design pattern
2
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Definizione
• Secondo Gamma [1994] un pattern è composto da
quattro elementi:
–
–
–
–
3
Un nome
Il problema
La soluzione
Le conseguenze
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Il nome
• Deve fornire una descrizione del problema, le sue
soluzioni e le sue conseguenze
– Ovviamente la scelta del nome è difficile in quanto un nome
particolarmente eloquente è difficile da trovare, lo sforzo può
essere compensato da alcuni vantaggi, come la capacità di
esprimere indicazioni sul pattern stesso
4
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Il problema
• Una descrizione che deve chiarire in quali casi il pattern
è utilizzabile.
• Oltre al problema deve essere spiegato anche il contesto
a cui il pattern è adatto
5
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
La soluzione
• Vengono descritti tutti gli elementi di progettazione, le
associazioni tra di essi e i loro compiti.
• La descrizione dovrebbe sempre avere un carattere
astratto e non tentare di descrivere una specifica
soluzione
6
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Le conseguenze
• Si dovrebbero esporre tutti i possibili effetti, come i costi
o i limiti in termini di esecuzione o di occupazione di
memoria, in modo che fin dall’inizio si possa valutare
l’usabilità del pattern
7
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
1.
2.
3.
4.
5.
8
Perché usare i design pattern
Riuso
Esperienza dello sviluppatore
Innovazione
Integrazione
Comunicazione
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
1: Riuso
I design pattern traggono origine dall’esperienza, cosa che
facilita essenzialmente il riuso delle conoscenze (al
contrario delle teoria astratte che devono essere adattate
alle applicazioni concrete)
9
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
2: Esperienza dello sviluppatore
• Tutti i progettisti nel corso delle loro attività,
consapevolmente o inconsapevolmente, usano soluzioni
progettuali simili tra loro (anche in aree diverse).
• Inoltre, la progettazione di software valido dipende in
modo determinante dagli anni di esperienza dello
sviluppatore; per questo motivo è una buona idea
mettere a disposizione della comunità queste esperienze.
10
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
3: Innovazione
Le innovazioni tecniche possono essere diffuse con
successo.
11
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
4: Integrazione
Le tecniche più sperimentate possono essere integrate
senza rischi con le conquiste tecniche assolutamente
nuove, non ancora sufficientemente verificate
12
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
5: Documentazione
I pattern costruiscono un modo ben documentato di
diffondere la documentazione di progetto
13
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
6: Comunicazione
Con l’aiuto dei pattern, gli sviluppatori di software possono
comunicare le loro esperienze in fatto di design. Spesso
è difficile realizzare una comunicazione tecnica chiara e
comprensibile; i pattern possono rimediare a questo
problema
14
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Caratteristiche dei pattern
• Sono generali e astratti
• Descrivono piccole unità il che li porta ad avere una
elevata flessibilità
15
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Tipi di pattern
• Esistono tipologie di pattern che si occupano di risolvere
problemi di natura diversa:
–
–
–
–
16
Suddivisione dei compiti in un sistema
Cooperazione tra oggetti in un sistema
Pattern per la struttura di interi sistemi
Ecc.
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Pattern nella programmazione
orientata agli oggetti
• Un problema ricorrente nella programmazione orientata
agli oggetti è definire la giusta struttura di classi per la
soluzione di un problema:
– Esistono molti pattern che descrivono le strutture basilari o parti
di esse che è possibile estendere e adattare più facilmente
– Consentono di definire le dimensioni degli oggetti:
• Se devono essere di piccole dimensioni e racchiudere solo pochi dati
oppure contenere molti dati o un intero sottosistema
17
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Caratteristiche dei design pattern
• I design pattern si caratterizzano per
– Granularità
– Livello d’astrazione
• Criteri di classificazione
– Scopo: cosa fa il pattern
– Raggio d’azione: se si applica a classi o a oggetti
18
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Scopo dei pattern
• Un pattern è:
– Creazionale: riguarda il processo di creazione di oggetti
– Strutturale: ha a che fare con la composizione di classi e oggetti
– Comportamentale: si occupa del modo in cui classi o oggetti
interagiscono reciprocamente e distribuiscono le loro
responsabilità
19
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Raggio d’azione
• Class pattern: riguardano le relazioni fra classi e
sottoclassi
– Espresse attraverso l’ereditarietà ↔ statiche↔ fissate al
momento della compilazione
• Object pattern: riguardano relazioni fra oggetti:
– Possono essere cambiate durante l’esecuzione, sono dinamiche
– Sono i più numerosi
20
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
•
•
•
•
•
21
Creazionali
Abstract factory
Builder
Factory method
Prototype
Singleton
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
•
•
•
•
•
•
•
22
Strutturali
Adapter
Bridge
Composite
Decorator
Facade
Flyweight
Proxy
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
•
•
•
•
•
•
•
•
•
•
•
23
Comportamentali
Chain of responsibility
Command
Interpreter
Iterator
Mediator
Memento
Observer
State
Strategy
Template method
Visitor
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
Catalogo dei pattern
DEE - Politecnico di Bari
Scopo
Raggio d’azione
24
Creazionale
Strutturale
Comportamentale
Classi
Factory method
Adapter
Interpreter
Template Method
Oggetti
Abstarct factory
Builder
Prototype
Singleton
Adapter
Bridge
Composite
Decorator
Facade
Flyweight
Proxy
Chain of responsibility
Command
Iterator
Mediator
Memento
Observer
State
Strategy
Visitor
Ingegneria del software
Marina
Mongiello
Corso di Laurea Triennale in Ingegneria Informatica
Corso di Sistemi Informativi
A. A. 2004 - 2005
Pattern strutturali
Adapter
Bridge
Decorator
Proxy
Facade
Flyweight
25
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Caratteristiche
• Si occupano delle modalità di composizione di classi e oggetti per
formare strutture complesse
• Basati su classi:
– Utilizzano l’ereditarietà per comporre interfacce o implementazioni
• Basati su oggetti:
– Descrivono modalità di composizione di oggetti per realizzare nuove
funzionalità
– Forniscono maggiore flessibilità grazie alla possibilità di cambiare la
composizione durante l’esecuzione
• Adapter; Bridge; Decorator; Proxy
• Composite; Flyweight
• Facade
26
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Adapter (o Wrapper) : scopo
• Convertire l’interfaccia di una classe in un’altra
interfaccia richiesta dal client.
• Consente a classi diverse di operare insieme quando ciò
non sarebbe altrimenti possibile a causa di interfacce
incompatibili.
27
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Adapter: motivazione
• Una classe di supporto progettata con obiettivi di riuso,
talvolta può non essere riusabile perché la sua
interfaccia non è compatibile con l’interfaccia specifica
richiesta da un’applicazione
28
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Adapter: esempio
• Un editor che consenta all’utente di disegnare e
comporre elementi grafici (linee, poligoni, testo, ecc) per
ottenere disegni e diagrammi
29
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
(Adapter ) Osservazioni
• Shape astratta: classe che definisce l’interfaccia per gli
oggetti grafici
• L’applicazione definisce una sottoclasse di Shape per
ciascuna tipologia di oggetto grafico:
– LineaShape per le linee
– PolygonShape per i poligoni ecc.
– TextShape più difficile da implementare
30
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
(Adapter) Problema/soluzione
• Problema: poter riusare la classe TextView per la
visualizzazione e la modifica del testo
– Gli oggetti TextView e Shape non possono essere usati in modo
intercambiabile
• Soluzioni:
– Modificare la classe TextView (ERRATA !)
– Definire TextShape in modo che adatti l’interfaccia TextView a
quella di Shape (Corretta)
31
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
(Adapter) Soluzione adottata
1. Ereditare l’interfaccia di Shape e l’implementazione di
TextView:
–
Pattern adapter basato su classi
2. Comporre un’istanza di TextView in una TextShape ed
implementare TextShape attraverso l’interfaccia di
TextView:
–
•
32
Pattern adapter basato su oggetti
Classe TextShape: adapter
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
Adapter (Esempio)
DEE - Politecnico di Bari
DrawingEditor
Shape
TextView
BoundingBox()
CreateManipulator()
Line
TextShape
BoundingBox()
CreateManipulator()
BoundingBox()
CreateManipulator()
GetExtent()
text
return->GetExtent()
return new TextManipulator
33
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
(Adapter) Osservazioni
• Oggetto adapter
• Richieste BoundingBox, dichiarate nella classe Shape
convertite in richieste GetExtent definite in TextView
• TextShape adatta TextView all’interfaccia Shape quindi
l’editor grafico può riusare la classe TextView che
altrimenti sarebbe incompatibile.
34
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
(Adapter) Vantaggi
• L’adapter fornisce funzionalità che la classe adattata non è in grado
di supportare:
– Nell’esempio:
• Un utente può trascinare ogni oggetto Shape in una nuova posizione in
maniera interattiva, ma la classe TextView non è stata progettata per
consentire ciò
• TextShape può consentire questa funzionalità mancante implementando
l’operazione CreateManipulator di Shape che ritorna un’istanza della
sottoclasse appropriata Manipulator.
• Manipulator è una classe astratta per oggetti che sanno muovere una Shape
come risposta a un’azione dell’utente (es. trascinamento di una figura verso
un’altra posizione)
35
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Adater: applicabilità
• Il pattern può essere usato nei seguenti casi:
– Quando si vuole usare una classe esistente, ma la sua interfaccia
non è compatibile con quella desiderata
– Quando si vuole creare una classe riusabile in grado di cooperare
con classi non correlate o impreviste, cioè con classi che non
necessariamente hanno interfacce compatibili
36
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Client
Adapter: struttura (classi)
Target
Adaptee
Request()
SpecificRequest()
(implementation)
Adapter
Request()
•
37
SpecificRequest()
Una classe adapter utilizza l’ereditarietà multipla per adattare un’interfaccia
a un’altra
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Client
Adapter: struttura (oggetti)
Target
Adaptee
Request()
Adapter
SpecificRequest()
adaptee
Request()
•
38
adaptee->SpecificRequest()
Un oggetto adapter si basa invece sulla composizione di oggetti
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Adapter: partecipanti
• Target (Shape)
– Definisce l’interfaccia specifica del dominio utilizzata dal client
• Client /DrawingEditor)
– Collabora con oggetti compatibili con l’interfaccia Target
• Adaptee (TextView)
– Individua un’interfaccia esistente che deve essere adattata
• Adapter (TextShape)
– Adatta l’interfaccia di Adaptee all’interfaccia Target
39
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Implementazione
class Shape {
public:
Shape();
virtual void BoundingBox(
Point &bottomLeft, Point& topRight) const;
virtual Manipulator *CreateManipulator () const;
};
class TextView{
public:
TextView();
void GetOrigin (Coord& x, Coord& y) const;
void GetExtent (Coord & width, Coord & height) const;
virtual bool IsEmpty() const;
};
La classe TextShape è adattatore tra queste due interfacce
40
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Implementazione (class pattern)
La classe adapter utilizza l’ereditarietà multipla per adattare le interfacce:
class TextShape: public Shape, private TextView{
public:
TextShape();
virtual void BoundingBox(
Point & bottomLeft, Point &topRight) const;
virtual bool IsEmpty() const;
virtual Manipulator* CreateManipulator() const;
};
41
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Implementazione
BoundingBox converte l’interfaccia di TextView in modo da renderla conforme a
Shape
void TextShape::BoundingBox (Point& bottomLeft, Point& topRight) const
{Coord bottom, left, width, height;
GetOrigin(bottom, left);
GetExtent(width, height);
bottomLeft = Point(bottom, left);
topRight =Point(bottom +height, left+width);
}
42
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Implementazione
L’operazione IsEmpty mostra un esempio di trasferimento delle richieste,
attività di base nell’implementazione degli adattatori:
bool TextShape::IsEmpty () const {
return TextView::IsEmpty();
}
CreateManipulator non è supportata da TextView (si suppone che la classe
textManipulator sia già implementata)
Manipulator* TextShape:: CreateManipulator() const{
return new TextManipulator(this);
}
43
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
•
•
Implementazione (object pattern)
L’oggetto adapter utilizza la composizione tra oggetti per combinare classi
con interfacce diverse.
L’adattatore TextShape mantiene un puntatore a TextView
class TextShape: Public Shape{
public:
TextShape(TextView*);
virtual BoundingBox(
Point& bottomLeft, Point& topRight) const;
virtual bool IsEmpty() const;
virtual Manipulator* CreateManipulator() const;
private:
TextView* _text;
};
44
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
•
•
•
Implementazione
TextShape deve inizializzare il puntatore all’istanza di TextView, e lo fa nel costruttore
Deve invocare le operazioni sull’oggetto TextView ogni volta che viene richiesta una sua operazione
Si suppone che il cliente crei l’oggetto TextView e lo passi al costruttore di TextShape
TextShape::TextShape (TextView* t){
_text=t;
}
void TextShape::BoundingBox( Point& bottomLeft, Point& topRight) const {
Coord bottom, left, width, height;
_text->GetOrigin(bottom, left);
_text->GetExtent(width, height);
bottomLeft =Point(bottom, left);
topRight(bottom+height,left+width);
}
bool TextShape::IsEmpty() const{
return _text->IsEmpty();
}
45
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
•
Implementazione
L’implementazione di CreateManipulator non cambia rispetto alla versione
basata sulla classe adapter, poiché è implementata da zero e non riusa nulla
di TextView:
Manipulator* TextShape::CreateManipulator() const{
return new TextManipulator(this);
}
•
•
L’utilizzo di un oggetto adapter è una soluzione più flessibile
Es. la versione oggetto adapter di TextShape può operare senza modifiche
anche con sottoclassi di TextView, basta che il client passi un’istanza della
sottoclasse di Textview al costruttore di TextShape
46
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Adapter: pattern correlati
• Bridge
• Decorator
• Proxy
47
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Bridge
• Ha una struttura simile a quella di un oggetto adapter,
ma ha un obiettivo diverso:
– Separare un’interfaccia dalla sua implementazione in modo che
le due possano variare facilmente e indipendentemente
48
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Bridge: scopo
• (Detto anche Handle/Body)
• Disaccoppia un’astrazione dalla sua implementazione in
modo che le due possano variare indipendentemente
49
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Bridge: motivazione
• Rendere un’astrazione più flessibile:
– Se un’astrazione può avere più implementazioni possibili, si ricorre
all’ereditarietà:
• Una classe astratta definisce l’interfaccia dell’astrazione le sottoclassi la
implementano in modi differenti
• Svantaggio: Tale soluzione è poco flessibile perché lega un’implementazione
a un’astrazione in modo permanente:
– è difficile
» Modificare
» Estendere
» Riusare
– astrazioni e implementazioni in modo indipendente
50
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
•
Il pattern bridge può essere usato nei seguenti casi:
1.
Evitare un legame permanente tra un’astrazione e la sua
implementazione

2.
3.
(se ad. L’implementazione deve essere selezionata o modificata durante
l’esecuzione)
Avere la possibilità di estendere sia le astrazioni che le
implementazioni usando il meccanismo delle sottoclassi

Il pattern consente di combinare le diverse astrazioni e implementazioni e
di estenderle in modo indipendente
I cambiamenti nell’implementazione di un’astrazione non devono
avere impatto sui client

51
Bridge: applicabilità (1/2)
Non si vuole ricompilare il client a seguito di cambiamenti
nell’implementazione di un’astrazione
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Bridge: applicabilità (2/2)
4. In C++ si vuole nascondere completamente ai client
l’implementazione di un’astrazione
–
La rappresentazione di una classe è visibile nell’interfaccia della
classe stessa
5. Esiste una serie di “generalizzazioni annidate”
6. Condividere una stessa implementazione fra più oggetti
nascondendo la condivisione ai client
52
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
Bridge: struttura
DEE - Politecnico di Bari
client
Abstraction
imp
Implementor
Operation()
OperationImp()
imp->OperationImp();
RefinedAbstraction
53
ConcreteImplementorA
ConcreteImplementorA
OperationImp()
OperationImp()
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
•
Abstraction
•
RefinedAbstraction
•
Implementor
•
ConcreteImplementor
54
Bridge: partecipanti
– Definisce l’interfaccia dell’astrazione
– Mantiene un riferimento a un oggetto di tipo Implementor
– Estende l’interfaccia definita da Abstraction
– Definisce l’interfaccia per le classi che implementano l’astrazione
– Non deve corrispondere esattamente all’interfaccia di Abstraction, ma le due
interfacce possono essere completamente diverse
– Implementor fornisce solo le operazioni di base mentre Abstraction definisce le
operazioni di più alto livello basate sull’uso di quelle di base
– Fornisce l’interfaccia Implementor e definisce la sua realizzazione concreta
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
•
•
•
55
Bridge: esempio
Implementazione dell’astrazione Window in un toolkit per interfacce utente: dovrebbe
consentire di scrivere applicazioni eseguite indifferentemente su piattaforme x e IBM
Presentation Manager:
–
usando l’ereditarietà sarebbe necessario:
–
Il codice del client diventa dipendente dalla piattaforma utilizzata
•
•
definire un nuova sottoclasse per ogni tipologia di finestra
e per ogni nuova piattaforma una nuova sottoclasse di Window per ogni tipologia di finestra
Il pattern bridge consente di introdurre due gerarchie di classi separate per le
astrazioni di window e per le relative implementazioni: tutte le operazioni sulle
sottoclassi di window sono implementate con operazioni astratte dell’interfaccia
WindowImp:
L’approccio consente di disaccoppaire l’astrazione fornita dalle implementazioni
specifiche: realizza un collegamento fra l’astrazione e la sua implementazione
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Decorator: scopo
• Aggiungere dinamicamente responsabilità a un oggetto
• Fornisce un’alternativa flessibile alla definizione di
sottoclassi come strumento per l’estensione delle
funzionalità
56
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
•
Decorator: motivazione
Aggiungere responsabilità a singoli oggetti e non a un’intera classe
– Si può aggiungere responsabilità mediante ereditarietà
– Svantaggio: approccio poco flessibile perché si procede staticamente
•
•
Usare un oggetto contenitore: decorator
Il decorator:
– ha un’interfaccia conforme a quella dell’elemento decorato in modo da rendere
trasparente la sua presenza ai client
– trasferisce le richieste al componente decorato e può svolgere azioni aggiuntive
•
È possibile annidare i decoratori in modo ricorsivo, consentendo l’aggiunta
di un numero illimitato di responsabilità agli oggetti decorati
57
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Decorator: applicabilità
• Il pattern decorator può essere utilizzato nei seguenti casi:
– Si vuole poter aggiungere responsabilità a singoli oggetti
dinamicamente ed in modo trasparente, senza, cioè coinvolgere altri
oggetti
– Si vuole poter togliere responsabilità agli oggetti
– L’estensione attraverso la definizione di sottoclassi non è praticabile:
• A volte è possibile definire un gran numero di estensioni indipendenti, fatto
che porterebbe a un’esplosione nel numero di sottoclassi per supportare
ogni possibile combinazione.
• O la definizione di un classe potrebbe essere nascosta, oppure non
disponibile per la creazione di sottoclassi
58
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Decorator: struttura
Component
Operation()
ConcreteComponent
Decorator
Operation()
Operation()
ConcreteDecoratorA
Operation()
addedState
59
component
Component->Operation()
ConcreteDecoratorB
Operation()
AddedBehavior()
Ingegneria del software
Decorator::Operation()
AddedBehavior();
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Decorator: partecipanti
• Component
– Definisce l’interfaccia comune per gli oggetti ai quali possono essere
aggiunte responsabilità dinamicamente
• ConcreteComponent
– Definisce un oggetto al quale possono essere aggiunte responsabilità
ulteriori
• Decorator
– Mantiene un riferimento a un oggetto Component e definisce
un’interfaccia conforme all’interfaccia di Component
• ConcreteDecorator
– Aggiunge responsabilità al componente
60
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Decorator: esempio
• Un ambiente per la realizzazione di interface utente dovrebbe
consentire di aggiungere proprietà quali i bordi, o comportamenti
quali lo scorrimento a ogni singolo componente dell’interfaccia
utente:
• Il pattern decorator consente di racchiudere il componente da
decorare in un altro responsabile dell’aggiunta del bordo. Il
decorator ha un’interfaccia conforme a quelle dell’elemento decorato
e trasferisce le richieste al componente decorato
61
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Decorator esempio
VisualCcmponent
Draw()
TextView
Decorator
Draw()
Draw()
ScrollDecorator
Draw()
ScrollTo()
component
BorderDecorator
Draw()
DrawBorder()
scrollPosition
62
Ingegneria del software
component->Draw()
Decorator::draw()
DrawBorder();
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Proxy: scopo
• (detto anche Surrogate)
• Fornire un surrogato o un segnaposto di un altro oggetto
per controllare l’accesso a tale oggetto
63
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Proxy: motivazione
• Controllo dell’accesso di un oggetto: rinviare il costo
della sua creazione e inizializzazione fino a quando
l’oggetto non è effettivamente necessario
64
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
•
Proxy: applicabilità
Il pattern è applicabile:
–
Ogni volta che si ha la necessità di avere un riferimento a un oggetto che sia più versatile o
raffinato di un semplice puntatore:
1. Un proxy remoto fornisce un rappresentante locale per un oggetto in un diverso spazio di
indirizzamento
2. Un proxy virtuale gestisce la creazione su richiesta dui oggetti”costosi”
3. Un proxy di protezione controlla l’accesso a un oggetto: si rivela utilae quando possono essere
definiti diritti di accesso diversi per gli oggetti
4. Un riferimento intelligente sostituisce un puntatore puro a un oggetto, consentendo l’esecuzione di
attività aggiuntive quando si accede all’oggetto referenziato:
–
–
–
65
Conteggio del numero di riferimenti all’oggetto reale per gestire automaticamente la sua distruzione quando non ci
sono più riferimenti attivi (il proxy è chiamato puntatore intelligente)
Caricamento di un oggetto persistente in memoria quando viene referenziato per la prima volta
Verifica che l’oggetto rappresentato sia riservato (locked) quando si richiede di accedervi in modo che nessun altro
oggetto possa modificarlo
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Client
Proxy: struttura
Subject
Request()
…..
RealSubject
Request()
…..
66
realSubject
Proxy
Request()
…..
Ingegneria del software
…
realSubject->Request();
….
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
•
Proxy
–
–
–
–
–
Mantiene un riferimento che consente al Proxy di accedere all’oggetto rappresentato RealSubject.
Un Proxy può accedere a un Subject se le interfacce Subject e RealSubject sono identiche
Fornisce un’interfaccia identica a quella definita da subject, consentendo quindi al proxy di agire come un
sostituto dell’oggetto destinazione
Controlla l’accesso all’oggetto rappresentato e può essere responsabile della sua creazione ed eliminazione
Altre responsabilità dipendono dal tipo di proxy:
•
•
•
proxy remoti: sono responsabili della codifica di una richiesta e dei suoi argomenti nonché dell’invio della richiesta
codificata all’oggetto rappresentato, posto in un diverso spazio di indirizzamento
proxy virtuali: possono memorizzare informazion addizionali sull’oggetto rappresentato allo scopo di posticipare l’accesso
a tale oggetto
proxy di protezione: verificano che il chiamante abbia i permessi di accesso necessari per poter effettuare una richiesta
all’oggetto rappresentato
•
Subject
•
RealSubject
67
Proxy: partecipanti
–
–
Definisce l’interfaccia comune per le classi RealSubject e Proxy, rendendo possibile l’utilizzo del Proxy in
tutte le situazioni in cui è previsto l’utilizzo di RealSubject
Caratterizza l’oggetto reale rappresentato dal proxy
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
•
•
Proxy: esempio
un editor di documenti che consenta di inserire oggetti grafici all’interno di
un documento: es. immagini di grandi dimensioni, possono introdurre costi
significativi per la loro creazione
Il pattern proxy consente di utilizzare un altro oggetto, un proxy
dell’immagine ( un segnaposto per l’immagine)
– ha lo stesso comportamento dell’immagine vera e propria
– si preoccupa di istanziarla quando richiesto
• il proxy crea l’immagine soltanto quando l’editor di documenti chiede al proxy di
disegnarla sullo schermo invocando l’operazione Draw
• tutte le richieste successive vengono trasferite dal proxy direttamente all’immagine
• Il proxy deve mantenere un riferimento all’immagine dopo la sua creazione
68
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Proxy: esempio
Graphic
DocumentEditor
Draw()
GetExtent()
Store
Load()
…..
Image
Draw()
GetExtent()
Store
Load()
…..
imageImp
extent
69
ImageProxy
image
Draw()
GetExtent()
Store
Load()
…..
filename
extent
Ingegneria del software
if (image==0){
image= LoadImage(fileName)}
Image>Draw()
if (image==0){
return extent;
} else{
return image>GetExtent();
}
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Facade: scopo
• Fornire un’interfaccia unificata per un insieme di
interfacce presenti in un sottosistema
• Definisce un’interfaccia di livello più alto che rende il
sottosistema più semplice da utilizzare
70
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Esame dei pattern strutturali
• Similarità fra i pattern esaminati (partecipanti e
collaborazioni)
• I pattern strutturali si basano sullo stesso insieme
ristretto di meccanismi messi a disposizione dai linguaggi
di programmazione per strutturare il codice e gli
oggetti:ereditarietà singola e multipla per i pattern basati
su classi e composizione per quelli basati su oggetti
71
Ingegneria del software
Marina
Mongiello
Corso di Laurea Triennale in Ingegneria Informatica
Corso di Sistemi Informativi
A. A. 2004 - 2005
Pattern comportamentali
Observer
Strategy
72
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Caratteristiche
• Si occupano di algoritmi e dell’assegnamento di responsabilità tra
oggetti collaboranti
• Oltre a pattern di classi e oggetti descrivono anche pattern di
comunicazione fra oggetti
• Caratterizzano flussi difficili da seguire durante l’esecuzione
• Spostano l’attenzione dal flusso di controllo e si focalizzano sul
modo in cui gli oggetti sono interconnessi tra loro.
73
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Caratteristiche
• Basati su classi:
– Utilizzano l’ereditarietà per distribuire responsabilità e comportamento
fra oggetti diversi
• Basati su oggetti:
– Usano la composizione degli oggetti al posto dell’ereditarietà
– Descrivono (alcuni) come un gruppo di oggetti cooperanti possa
realizzare funzionalità impossibili per un oggetto singolo
– Descrivono come i singoli oggetti si riferiscono l’uno all’altro:
• mantenere riferimenti espliciti agli altri oggetti aumenterebbe notevolmente
l’accoppiamento
74
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Observer: scopo
• Detto anche Dependents, Publish-Subscribe
• Definire una dipendenza uno a molti fra oggetti, in modo
tale che se un oggetto cambia il suo stato, tutti gli
oggetti dipendenti da questo siano notificati e aggiornati
automaticamente
75
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Observer: motivazione
• Il partizionamento di un sistema in insiemi di classi
collaboranti comporta la necessità di mantenere un alto
livello di consistenza tra le classi correlate.
• La consistenza non deve essere ottenuta a scapito
dell’accoppiamento che deve rimanere basso
76
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Observer: applicabilità
• Il pattern Observer può essere usato nei seguenti casi:
– Un’astrazione presenta due aspetti, di cui uno dipendente dall’altro.
• Incapsulando questi aspetti in due oggetti separati è possibile riusarli
indipendentemente
– Una modifica a un oggetto richiede modifiche ad altri oggetti che
dipendono da questo, ma in generale non si conosce il numero degli
oggetti
– Un oggetto ha bisogno di notificare ad altri oggetti senza conoscerne
l’identità precisa: si vuole mantenere un alto livello di disaccoppiamento
77
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
Observer: struttura
DEE - Politecnico di Bari
observers
Subject
Observer
Attach(Observer)
Detach(observer)
Notify()
Update()
for all in observers{
o->Update()}
ConcreteObserver
subject
ConcreteSubject
GetState()
SetState()
return subjectState
Update()
ObserverState=
Subject->getState()
observerState
subectState
78
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
•
Subject
•
Observer
•
ConcreteSubject
•
ConcreteObserver
Observer: partecipanti
– Conosce i propri Observer. Un numero qualsiasi di oggetti Observer può
osservare un soggetto
– Fornisce un’interfaccia per associare e dissociare oggetti Observer
– Fornisce un’interfaccia di notifica per gli oggetti a cui devono essere notificati i
cambiamenti nel subject
– Contiene lo stato a cui gli oggetti concreteObserver sono interessati
– Memorizza un riferimento a un oggettoConcreteSubject
– Contiene informazioni che devono essere constantemente sincronizzate con lo
stato del subject
– Implementa l’interfaccia di notifica di Observer per mantenere il proprio stato
consistente con quello del subject
79
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Observer: pattern correlati
• Mediator: incapsulando una semantica d’aggiornamento
complessa, ChangeManager svolge il ruolo di Mediato fra
soggetto e osservatori
• Singleton: ChangeManager può usare il pattern Singleton
per rendersi unico e globalmente accessibile
80
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Strategy: scopo
• Definire una famiglia di algoritmi, incapsularli e renderli
intercambiabili. Strategy permette agli algoritmi di
variare indipendentemente dai client che ne fanno uso
– Detto anche: policy
81
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Strategy: motivazione
• Codificare dinamicamente in classi algoritmi che
realizzano le stesse funzionalità
• È possibile definire delle classi che incapsulano svariati
algoritmi mediante il pattern strategy: l’algoritmo
incapsulato è chiamato strategy
82
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
•
Strategy: applicabilità
È opportuno usare il pattern strategy nei seguenti casi:
– Molte classi correlate differiscono fra loro solo per il comportamento.
• Strategy fornisce un modo per configurare una classe con un comportamento scelto fra
tanti
– Sono necessarie più varianti di un algoritmo.
• Per esempio, è possibile definire più algoritmi con bilanciamenti diversi fra occupazione
di memoria, velocità di esecuzione, ecc.
– il pattern strategy può essere utilizzato quando queste varianti sono implementate sotto forma
di gerarchia di classi di algoritmi
– Un algoritmo usa una struttura dati che non dovrebbe essere resa nota ai client.
– Il pattern strategy può essere usato per evitare di esporre strutture dati complesse e specifiche
dell’algoritmo
– Una classe definisce molti comportamenti che compaiono all’interno di scelte
condizionali multiple. Al posto di molte scelte condizionali, si suggerisce di
spostare i blocchi di codice correlati in una classe strategy dedicata
83
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
84
Strategy: struttura
Context
Strategy
ContextInterface()
ContextInterface()
ConcreteStrategyA
ConcreteStrategyB
ConcreteStrategyC
AlgorithmInterface()
AlgorithmInterface()
AlgorithmInterface()
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Strategy: partecipanti
• Strategy (compositor)
– Dichiara un’interfaccia comune a tutti gli algoritmi supportati. Context
usa quest’interfaccia per invocare l’algoritmo definito da un
ConcreteStrategy
• ConcreteStartegy (Simplecompositor, TextCompositor,
Arraycompositor)
– Implementa l’algoritmo usando l’interfaccia Strategy
• Context (Composition)
– È configurato con un oggetto ConcreteStrategy
– Contiene un riferimento a un oggetto Strategy
– Può definire un’interfaccia che permetta a Strategy di accedere alla sua
struttura dati
85
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Strategy: collaborazioni
• Strategy e Context collaborano per implementare l’algoritmo voluto:
• Context può passare tutti i dati necessari dall’algoritmo a Strategy quando
viene invocato l’algoritmo.
• Oppure Context può passare se stesso come parametro ai metodi di
Strategy.
• Ciò permette a Strategy di invocare i metodi appropriati su Context
• Context inoltra le richieste dai propri client verso Strategy.
• I client di solito creano e passano un oggetto ConcreteStrategy al contesto
(per inizializzarlo);
– da quel momento i client interagiranno solo con context.
• Spesso il client può scegliere l’oggetto ConcreteStrategy da una famiglia di
sottoclassi concrete di Strategy
86
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Strategy: conseguenze
•
•
•
•
•
•
•
Famiglie di algoritmi correlati
Un’alternativa all’ereditarietà
Le strategie eliminano i blocchi condizionali
Scelta dell’implementazione
I client devono conoscere le diverse Strategy disponibili
Collaborazioni fra Strategy e Context dispendiosa
Aumento del numero di oggetti
87
Ingegneria del software
Marina
Mongiello
Corso di Laurea Triennale in Ingegneria Informatica
Corso di Sistemi Informativi
A. A. 2004 - 2005
Pattern creazionali
88
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Caratteristiche
• Forniscono un’astrazione del processo di istanziazione
degli oggetti
• Aiutano a rendere un sistema indipendente dalla
modalità di creazione, composizione e rappresentazione
degli oggetti utilizzati
89
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Caratteristiche
• Basati su classi: utilizza l’ereditarietà per scegliere le
particolari classe da istanziare
• Basati su oggetti: delega l’istanziazione a un altro
oggetto
90
Ingegneria del software
Marina
Mongiello
Sistemi Informativi
DEE - Politecnico di Bari
Caratteristiche
• Capacità di incapsulare la conoscenza delle classi
concrete utilizzate nel sistema
• Capacità di nascondere le modalità di creazione e
composizione di tali classi
91
Ingegneria del software
Marina
Mongiello
Fly UP