Beruflich Dokumente
Kultur Dokumente
Riferimenti
• Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides,
“Design Patterns: Elements of Reusable Object Oriented Software“.
• http://www.dofactory.com/Patterns/Patterns.aspx
• www.lta.disco.unimib.it/didattica/IngSw/slide/Design
Patterns/Presentazione Design Patterns-03.ppt
• http://www.elet.polimi.it/upload/picco/Teaching/softeng/slides/Design
Patterns-Lucidi.pdf
• Marcello Esposito, Elementi per la progettazione di. Software
Object-Oriented riusabile ed estensibile,
http://www.grid.unina.it/Didattica/P1/tlc0405/slides/11%20-
%20DesignPatterns.pdf
• Abbastanza astratti
– in modo da poter essere condivisi da progettisti con punti di vista
diversi
1. Il nome del pattern, è utile per descrivere la sua funzionalità in una o due
parole.
Design Descrizione
Patterns
Separa la costruzione di un oggetto complesso dalla sua
Builder rappresentazione in modo da poter usare lo stesso processo di
costruzione per altre rappresentazioni
Abstract Provvede ad un interfaccia per creare famiglie di oggetti in
Factory relazione senza specificare le loro classi concrete
Factory Method Definisce un interfaccia per creare un oggetto ma lascia
decidere alle sottoclassi quale classe istanziare
Prototype Specifica il tipo di oggetto da creare usando un istanza
prototipo e crea nuovi oggetti copiando questo prototipo
Singleton Assicura che la classe abbia una sola istanza e provvede un
modo di accesso
P.Tramontana – 2009 – Ingegneria del Software - Design Patterns 15
DP: Singleton (Creazionale)
• Nome: Singleton
• Sinonimo : Kit
• Sinonimo : Wrapper
Target Adaptee
Client
+Request() +SpecificRequest()
Adapter
+Request() {SpecificRequest();}
Target Adaptee
Client
Request() SpecificRequest()
adaptee
Adapter Adaptee. SpecificReques t()
Request()
Target Adaptee
Adapter
• Applicabilità:
Adapter puo essere utilizzato :
1. Se si vuole utilizzare una classe esistente la cui interfaccia
sia incompatibile
2. Se si vuole creare una classe (riusabile) che dovrà
collaborare con classi non prevedibili al momento della sua
creazione
3. Se si vuole riusare un insieme di sottoclassi esistenti, ma è
scomodo adattare l’interfaccia creando una sottoclasse per
ciascuna: meglio creare un adattatore per la classe
genitore
// Adaptee
class TextView
{
public:
TextView();
void GetOrigin(Coord& x, Coord& y) const;
void GetExtent(Coord& width, Coord& height) const;
virtual bool IsEmpty() const;
};
P.Tramontana – 2009 – Ingegneria del Software - Design Patterns 32
Esempio codice C++
// Adapter
class TextShape: public Shape, private TextView
{ //eredita privatamente da TextView, perché non vuole inoltrare l’ereditarietà
public:
TextShape();
void BoundingBox(Point& bottomLeft, Point& topRight) const;
virtual bool IsEmpty() const;
Manipulator* CreateManipulator() Const;
};
// Implementazione TextShape::BoundingBox
void TextShape::BoundingBox(Point& bottomLeft, Point& topRight) const
{
Coord bottom, left, width, height;
GetOrigin(bottom,left); // metodi ereditati da TextView
GetExtent(width,height);
bottomLeft=Point(bottom,left);
topRight=Point(bottom+height,left+width)
};
P.Tramontana – 2009 – Ingegneria del Software - Design Patterns 33
Esempio
• Nella realizzazione di un software object oriented per il mercato statunitense si
vuole realizzare una classe Health che fornisca, tra l’altro, l’indice di massa
corporeo (IMC) di una persona, secondo l’interfaccia riportata qui sotto:
Health
+IMC
+Evaluate_IMC(Weight, Height)
- Si progetti il class diagram a livello di dettaglio che sia in grado di risolvere il problema
proposto svincolando il programmatore della classe Health dalla conoscenza
dell’interfaccia e dell’implementazione della classe IMC, utilizzando il design pattern
Adapter.
P.Tramontana – 2009 – Ingegneria del Software - Design Patterns 34
Soluzione possibile
{imc.Calcola(PesoKg,AltezzaM)}
Health
Target_
+IMC Adaptee_
Adapter_
IMC
{CalcolaIMC(WPound/0.453,HInch/0.0254} +Evaluate(WPound, HInch)
+Calcola(PesoKg, AltezzaM)
Graphic
Draw()
Add(g : Graphic)
Remove(g : Graphic)
GetChild(i : Integer)
+graphic s
Client Add(Component)
Remove(Component)
GetChild()
Operation()
Composite
Leaf
Add()
Operation() Remove()
GetChild()
• Problema:
– Il soggetto deve essere indipendente dal numero e dal tipo degli
osservatori
– Deve essere possibile aggiungere nuovi osservatori durante
l’esecuzione dell’applicazione
• Soluzione:
– inserire nel soggetto delle operazioni che consentono
all’osservatore di dichiarare il proprio interesse per un
cambiamento di stato
AbstractSubject
observers 0..n Observer
for all o in observers attach()
o.update() detach() update()
notify()
ConcreteSubject ConcreteObserver
subject ConcreteObserver()
observerSt ate
getState() {subject.attach();}
1
setState() update()
observerState=subject.getState
setState( )
update( ) notify( )
getState( )