17
© Renato Conte - Design patterns - 1 / 67 - Design Patterns Questa presentazione prende spunto dal testo Design Patternsdella banda dei quattro* *(vedi bibliografia alla fine delle presentazioni) Università di Padova Facoltà di Scienze MM.FF.NN Informatica - anno 2008-09 Corso di Ingegneria del Software © Renato Conte - Design patterns - 2 / 67 - Pattern? “ Nel gioco degli scacchi per essere: un principiante, basta conoscere le regole del gioco e le principali mosse; un discreto giocatore, bisogna riconoscere gli errori ed imparare alcune strategie di posizionamento; maestro, bisogna studiare le partite dei grandi maestri, individuarne i pattern pattern nascosti, memorizzarli e applicarli finché diventano una seconda natura. ” ( da uno scritto di R.G.Martin, liberamente adattato ) © Renato Conte - Design patterns - 3 / 67 - Design Pattern Ogni pattern descrive un problema che si ripete più e più volte nel nostro ambiente, descrive poi il nucleo della soluzione, in modo tale da poter essere riutilizzato Un design pattern sistematicamente fissa, spiega e valuta progetti importanti e ricorrenti. © Renato Conte - Design patterns - 4 / 67 - Pattern e Framework I pattern descrivono strutture statiche e dinamiche di soluzioni già collaudate con successo che possono applicarsi ai nostri problemi e semplificare i nostri progetti I pattern supportano il riuso dell’architettura e della progettazione software Un framework è un insieme integrato di componenti che forniscono lo scheletro di un’applicazione riusabile per uno specifico dominio applicativo. Un framework deve essere personalizzato. I framework supportano il riuso di progetti dettagliati e di codice già pronto Insieme, design pattern e framework, aiutano a migliorare la qualità del software e riducono i tempi di sviluppo, cioè migliorano: il riuso, l’estensibilità, la modularità, le prestazioni

Design Patterns - MathUniPDlocalconte/lezioni/Pattern(1e2).pdf · 2009-01-07 · Descrizione di un Design Pattern (2) Applicability What are the situations in which the design pattern

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

© Renato Conte - Design patterns - 1 / 67 -

Design Patterns Questa presentazione prende spunto dal testo

“Design Patterns” della banda dei quattro*

*(vedi bibliografia alla fine delle presentazioni)

Università di Padova

Facoltà di Scienze MM.FF.NN

Informatica - anno 2008-09

Corso di Ingegneria del Software

© Renato Conte - Design patterns - 2 / 67 -

Pattern?

“ Nel gioco degli scacchi per essere:

• un principiante, basta conoscere le regole del gioco e le principali mosse;

• un discreto giocatore, bisogna riconoscere gli errori ed imparare alcune strategie di posizionamento;

• maestro, bisogna studiare le partite dei grandi maestri, individuarne i patternpattern nascosti, memorizzarli e applicarli finché diventano una seconda natura. ”

( da uno scritto di R.G.Martin, liberamente adattato )

© Renato Conte - Design patterns - 3 / 67 -

Design Pattern

Ogni pattern descrive un problema che si ripete più e più volte nel nostro ambiente, descrive poi il nucleo della soluzione, in modo tale da poter essere riutilizzato

Un design pattern sistematicamente fissa, spiega e valuta progetti importanti e ricorrenti.

© Renato Conte - Design patterns - 4 / 67 -

Pattern e Framework

I pattern descrivono strutture statiche e dinamiche di soluzioni già collaudate con successo che possono applicarsi ai nostri problemi e semplificare i nostri progetti I pattern supportano il riuso dell’architettura e della progettazione software

Un framework è un insieme integrato di componenti che forniscono lo scheletro di un’applicazione riusabile per uno specifico dominio applicativo. Un framework deve essere personalizzato.I framework supportano il riuso di progetti dettagliati e di codice già pronto

Insieme, design pattern e framework, aiutano a migliorare la qualità del software e riducono i tempi di sviluppo, cioè migliorano: il riuso, l’estensibilità, la modularità, le prestazioni

© Renato Conte - Design patterns - 5 / 67 -

Come diventare un “Master Designer”Primo - imparare le regole:

AlgoritmiStrutture datiLinguaggi (di programmazione e di progettazione)

In seguito - conoscere i principi della programmazione e dell’analisi:Programmazione strutturataOO POOA OOD

Infine - studiare i progetti e le soluzioni degli esperti: I “Design pattern” devono essere compresi, memorizzati ed applicati

Esistono migliaia di pattern © Renato Conte - Design patterns - 6 / 67 -

Storia dei pattern‘77 - Il lavoro dell’architetto Christopher Alexander

‘80 - Kent Beck e i primi pattern in Smalltalk

‘91 - Tesi di dottorato di Gamma su ET++

‘92 - Pubblicazione di Coad sui pattern

‘92 - Pubblicazione di Johnson ( a OOPSLA)

‘93 - OOPSLA: workshop di Coad & Anderson

‘93 - Gruppo di discussione su WWW

‘94 - Prima conferenza PLoP

‘95 - Gang of four book (prima presentazione OOPSLA 93)

... e molto altro ...

© Renato Conte - Design patterns - 7 / 67 -

Classificazione dei pattern del GoF

Factory Method

Abstract FactoryBuilderPrototypeSingleton

Adapter (class)

Adapter (object)BridgeCompositeDecoratorFacadeFlyweightProxy

InterpreterTemplate Method

Chain of Responsibility

CommandIteratorMediatorMementoObserverStateStrategyVisitor

Creazionali Strutturali Comportamentali

Scopo

ScopeClass

Object

© Renato Conte - Design patterns - 8 / 67 -

Tipi di Design Pattern

Creazionale (Creational patterns)– Tratta l’argomento della configurazione ed inizializzazione di classi ed oggetti

Strutturale (Structural patterns)– Tratta l’argomento del disaccoppiamento tra interfacce ed implementazione delle classi e degli oggetti e della loro composizione

Comportamentale (Behavioral patterns)– Tratta l’argomento delle interazioni dinamiche tra gruppi di classi ed oggetti

© Renato Conte - Design patterns - 9 / 67 -

Pattern Creazionali: aspetti progettuali coinvolti

(1) Factory Method– creazioni istanze di sottoclassi

(2) Abstract FactoryAbstract Factory– famiglie di oggetti

(3) Builder– creazione incrementale di oggetti complessi

(4) Prototype– clonazione di nuove istanze da prototipo

(5) Singleton – unica istanza

© Renato Conte - Design patterns - 10 / 67 -

Pattern Strutturali: aspetti progettuali coinvolti (1)

(6) AdapterAdapter– adattamento interfaccia

(7) Bridge– disaccoppiamento astrazione / implementazione

(8) CompositeComposite– strutture per costruire aggregazioni di oggetti

(9) Decorator– estensione delle funzionalità di un oggetto in modo trasparente

© Renato Conte - Design patterns - 11 / 67 -

Pattern Strutturali: aspetti progettuali coinvolti (2)

(10) FaFaççadeade– semplifica l’interfaccia ad un sottosistema

(11) Flyweight– condivisione per gestire numerosi oggetti

(12) Proxy– un oggetto approssima un altro

© Renato Conte - Design patterns - 12 / 67 -

Pattern Comportamentali: aspetti progettuali coinvolti (1)

(13) Interpreter– interprete di un linguaggio per semplici grammatiche

(14) Template MethodTemplate Method– gestione di un algoritmo con passi definiti da sottoclassi

(15) Chain of Responsibility – disaccoppiamento mittente destinatario (lista destinatari)

(16) Command– gestione comandi per un oggetto

© Renato Conte - Design patterns - 13 / 67 -

Pattern Comportamentali: aspetti progettuali coinvolti (2)

(17) IteratorIterator– per l’accesso sequenziale su aggregati di oggetti

(18) Mediator– permette un basso accoppiamento tra oggetti che interagiscono

(19) Memento– cattura e ripristina lo stato interno di un oggetto

(20) ObserverObserver– aggiornamenti automatici su oggetti dipendenti da un altro oggetto © Renato Conte - Design patterns - 14 / 67 -

Pattern Comportamentali: aspetti progettuali coinvolti (3)

(21) State– oggetto il cui comportamento dipende dal suo stato

(22) Strategy– astrazione per la selezione di algoritmi

(23) Visitor– operazioni applicate ad elementi di una struttura di oggetti eterogenei

© Renato Conte - Design patterns - 15 / 67 -

Descrizione di un Design Pattern (1) tratto da: http://hillside.net/patterns/writing/GOFtemplate.htm

(trad.§1.3)Pattern Name (Scope, Purpose)The pattern's name conveys the essence of the pattern succinctly. A good name is vital, because it will become part of your design vocabulary.

IntentA short statement that answers the following questions: What does the design pattern do? What is its rationale and intent? What particular design issue or problem does it address?

Also Known AsOther well-known names for the pattern, if any.

MotivationA scenario that illustrates a design problem and how the class and object structures in the pattern solve the problem. The scenario will help you understand the more abstract description of the pattern that follows.

© Renato Conte - Design patterns - 16 / 67 -

Descrizione di un Design Pattern (2)

ApplicabilityWhat are the situations in which the design pattern can be applied? What are examples of poor designs that the pattern can address? How can you recognise these situations? Structure & ParticipantsThe classes and/or objects participating in the design pattern and their responsibilities.

CollaborationsHow the participants collaborate to carry out their responsibilities.

ConsequencesHow does the pattern support its objectives? What are the tradeoffs and results of using the pattern? What aspect of system structure does it let you vary independently?

© Renato Conte - Design patterns - 17 / 67 -

Descrizione di un Design Pattern (3)

ImplementationWhat pitfalls, hints, or techniques should you be aware of when implementing the pattern? Are there language-specific issues?

Sample Code and UsageCode fragments that illustrate how you might implement the pattern in C++ , Smalltalk, Java.Program Listing

Known UsesExamples of the pattern found in real systems. We include at least two examples from different domains.

Related PatternsWhat design patterns are closely related to this one? What are the important differences? With which other patterns should this one be used?

© Renato Conte - Design patterns - 18 / 67 -

Alcuni esempi di design pattern

© Renato Conte - Design patterns - 19 / 67 -

Facade Patternstrutturale

(scritto anche Façade)

• Fornisce un’interfaccia unificata per un insieme di interfacce presenti in un sottosistema

• Façade definisce una interfaccia a più alto livello di

astrazione che rende il sottosistema più semplice da utilizzare

© Renato Conte - Design patterns - 20 / 67 -

Façade Pattern: motivazioni d’utilizzo

• Si usa un oggetto Façade per avere una singola e semplice interfaccia, al posto di più interfacce complesse

• Minimizza la comunicazione e la dipendenza tra sottosistemi

• Promuove l’accoppiamento lasco fra un sottosistema ed i suoi client.

© Renato Conte - Design patterns - 21 / 67 -

Struttura e significato di un Façade Pattern

Subsystem Classes

Façade

Client Classes

Subsystem Classes

Client Classes

© Renato Conte - Design patterns - 22 / 67 -

Esempio applicativo di Façade Pattern

Compiler

Scanner

Parser

Token

ProgNode

ProgNodeBuilder

RISCCG

StackMachineCG

Statement Node

Expression Node

Variable NodeCompiler Subsystem Classes

Compile()

CodeGenerator

© Renato Conte - Design patterns - 23 / 67 -

Partecipanti del Façade Pattern

• Façade (compiler):– conosce le classi nel sottosistema che sono responsabili di

una richiesta– delega le richieste dei client agli oggetti appropriati nel

sottosistema• Subsystem Classes (scanner, parser, ...):

– implementano le funzionalità del sottosistema.– Non hanno alcuna conoscenza dell’esistenza del Facade;

cioè non mantengono alcun riferimento ad esso.

© Renato Conte - Design patterns - 24 / 67 -

Es. codice per Façade

class Compiler { public: Compiler(); void Compile( istream&, BytecodeStream& );}; void Compiler::Compile ( istream& input, BytecodeStream& output )

{ Scanner scanner( input ); ProgramNodeBuilder builder; Parser parser; parser.Parse(scanner, builder); RISCCodeGenerator generator(output); ProgramNode* parseTree = builder.GetRootNode(); parseTree->Traverse(generator);}

© Renato Conte - Design patterns - 25 / 67 -

Adapter Patternstrutturale

detto anche Wrapper

Converte l’interfaccia di una classe in un’altra interfaccia richiesta dal cliente (risolve l’incompatibilità d’interfaccia)

Usato quando vogliamo riutilizzare classi in una applicazione che prevede l’uso (riuso) di classi con differenti interfacce (e noi non vogliamo cambiare le interfacce delle classi già esistenti )

© Renato Conte - Design patterns - 26 / 67 -

Stuttura dell’Adapter Pattern usando l’ereditarietà multipla

Client TargetRequest()

AdapteeSpecificRequest()

AdapterRequest()

{implementation}

call SpecificRequest()

© Renato Conte - Design patterns - 27 / 67 -

Stuttura dell’Adapter Pattern usando la composizione

Client TargetRequest()

AdapteeSpecificRequest()

AdapterRequest()

+adaptee

SpecificRequest()

© Renato Conte - Design patterns - 28 / 67 -

Esempio d’utilizzo dell’ Adapter Pattern

Editor ShapeBoundingBox()

CreateManipulator()

TextViewGetExtent()

LineShapeBoundingBox()

CreateManipulator()

TextShapeBoundingBox()

CreateManipulator()

text

*

return new Text Manipulator

return text -> GetExtent()

© Renato Conte - Design patterns - 29 / 67 -

Partecipanti dell’Adapter Pattern

• 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

© Renato Conte - Design patterns - 30 / 67 -

Codice Adapter Pattern

class Shape //target { public: Shape(); virtual void BoundingBox( Point& bottomLeft, Point& topRight ) const; virtual Manipulator * CreateManipulator() const;};

class TextView //adaptee { public: TextView(); void GetOrigin(Coord& x, Coord& y) const; void GetExtent(Coord& width, Coord& height) const; virtual bool IsEmpty() const;};

© Renato Conte - Design patterns - 31 / 67 -

Codice Adapter Pattern

class TextShape : public Shape, private TextView //adapter{ public: TextShape(); virtual void BoundingBox( Point& bottomLeft, Point& topRight ) const; virtual bool IsEmpty() const; virtual Manipulator* CreateManipulator() const;};

class TextShape : public Shape //adapter{ public: TextShape(); virtual void BoundingBox( Point& bottomLeft, Point& topRight ) const; virtual bool IsEmpty() const; virtual Manipulator* CreateManipulator() const;private: TextView * text; };

© Renato Conte - Design patterns - 32 / 67 -

Composite Pattern strutturale

• Per comporre oggetti in strutture ad albero per rappresentare gerarchie “parte-tutto”.

• Consente ai client di trattare oggetti singoli e composizioni in modo uniforme.

© Renato Conte - Design patterns - 33 / 67 -

Struttura di Composite Pattern in UML

Component {abstract}Operation()Add(Component)Remove(Component)GetChild(int)

Leaf

Operation()

Composite

Operation()Add(Component)Remove(Component)GetChild(int)

Per tutti i g in Componentg.Operation()

1..*Client

children

Alternativa...

0..*Alternativa

© Renato Conte - Design patterns - 34 / 67 -

Esempio di un Composite Pattern

GraphicDraw()Add(Graphic)Remove(Graphic)GetChild(int)

Line TextRect.

Draw() Draw()Draw()

PictureDraw()Add(Graphic)Remove(Graphic)GetChild(int)

Per tutti i g in graphicsg.Draw()

1..*graphicsClient

© Renato Conte - Design patterns - 35 / 67 -

Esempio di una istanza di composizioni

compositeA: Picture

:Line { leaf } :Rect. { leaf } compositeB: Picture

:Line { leaf }

:Circle { leaf }

la: Line { leaf } lb: Line { leaf } lc: Line { leaf }

compositeC: Picture

© Renato Conte - Design patterns - 36 / 67 -

Partecipanti

• Component (graphic):– Dichiara l’interfaccia per gli oggetti della

composizione.– Implementa i metodi comuni a tutti i componenti– Dichiara un’interfaccia per l’accesso e la gestione

dei suoi componenti figli.– (Opzionale) definisce un’interfaccia o un metodo per

poter accedere al componente padre

© Renato Conte - Design patterns - 37 / 67 -

Partecipanti

• Leaf (line, text, circle, ...):– Rappresenta gli oggetti foglia della composizione (oggetti

primitivi).

• Composite (picture):– Definisce il comportamento per i componenti che hanno

figli.– Memorizza i componenti figli

• Client: – Manipola gli oggetti della composizione utilizzando

l’interfaccia Component (Graphics).

© Renato Conte - Design patterns - 38 / 67 -

Template Method Pattern comportamentale

• Permette che la struttura di un algoritmo non cambi al variare delle implementazioni

• Definisce alcune parti di un algoritmo (parte invariante), e lascia alle sottoclassi il compito di implementare le parti che possono variare

© Renato Conte - Design patterns - 39 / 67 -

Struttura di un Template Method Pattern

templateMethod()templateMethod()primitiveOp1( ) {abstract}primitiveOp2( ) {abstract}

AbstractClass

ConcreteClass

primitiveOp1()primitiveOp2()

Usa op. astratte

primitiveOp1()primitiveOp2()

...

© Renato Conte - Design patterns - 40 / 67 -

FrameworkFramework

Esempio Template MethodTemplate Method Pattern

OpenDocument( )OpenDocument( )AddDocument( )DoCreateDocument( ) {abstract}

Application {abstract}

MyApplication

DoCreateDocument()

Save( ) Open( ) Close( ) DoRead( ) {abstract}

Document {abstract}

MyDocumentDoRead()

*

metodo “gancio”da ridefinire

© Renato Conte - Design patterns - 41 / 67 -

Esempio di codice C++

class Application // abstract{ public: void OpenDocument(const char*); void AddDocument(const char*); virtual Document* DoCreateDocument(const char*) = 0;};

void Application::OpenDocument (const char* name) { Document* doc = DoCreateDocument( name ); if (doc) { doc->Open(); doc->DoRead(); }}

© Renato Conte - Design patterns - 42 / 67 -

Iterator Patterncomportamentale

detto anche Cursore

• Fornisce un modo per accedere sequenzialmente agli elementi di un aggregato (o oggetto composito), senza esporne la struttura

• Muove la responsabilità per accedere e navigare nell’aggregato, dall’aggregato stesso all’oggetto iteratore

© Renato Conte - Design patterns - 43 / 67 -

Iterator Pattern: motivazioni

• Si può decidere di attraversare un aggregato in diversi modi

• Si possono avere più iteratori indipendenti sullo stesso aggregato.

• L’aggregato non necessita di modificare la sua interfaccia per permettere vari tipi di attraversamento

© Renato Conte - Design patterns - 44 / 67 -

Esempio: più oggetti iteratori su lista

FilteringListIterator

First()Next()IsDone(): booleanCurrentItem(): Element

index

list

List

Count() Append(Element) Remove(Element)

ListIterator

First()Next()IsDone(): booleanCurrentItem(): Element

index

list

© Renato Conte - Design patterns - 45 / 67 -

Alcuni problemi con gli iteratori

© Renato Conte - Design patterns - 46 / 67 -

ConcreteSkipList

CreateIterator()

Struttura di un Iterator Pattern in UMLAbstractList

CreateIterator()

Iterator {abstract}

First()Next()IsDone(): booleanCurrentItem(): element

ConcreteListIteratorConcreteList

CreateIterator()

return new ConcreteListIterator(this)

Client

ConcreteSkipListIterator

{ instantiate }

{ instantiate }

link

link

© Renato Conte - Design patterns - 47 / 67 -

Struttura di un Iterator Pattern in UML

Aggregate {abstract}

CreateIterator()

ConcreteAggregate

CreateIterator()

Iterator {abstract}

First()Next()IsDone(): booleanCurrentItem(): element

ConcreteIterator

return new ConcreteIterator(this)

Client

{ instantiate }

© Renato Conte - Design patterns - 48 / 67 -

Partecipanti di un Iterator Pattern

• Iterator (AbstractIterator): definisce una interfaccia per accedere ed navigare tra gli elementi.

• Concrete Iterator: implementa l’interfaccia dell’iteratore e mantiene traccia della posizione corrente durante l’attraversamento

• Aggregate: definisce l’interfaccia per creare l’oggetto iteratore

• Concrete Aggregate: implementa l’interfaccia per la creazione dell’iteratore che restituisce l’appropriato iteratore concreto

© Renato Conte - Design patterns - 49 / 67 -

Codice C++

class AbstractList // Aggregate{ public: List(); virtual Iterator * CreateIterator() const = 0; long Count() const;

// ......// ........

}; class Iterator // Abstract{ public: virtual void First() = 0; virtual void Next() = 0; virtual bool IsDone() const = 0; virtual Item CurrentItem( ) const = 0;protected: Iterator();};

© Renato Conte - Design patterns - 50 / 67 -

Codice C++

// Metodo della lista concreta

Iterator * ConcreteList::CreateIterator( ) const { return new ListIterator( this );}

class ListIterator : public Iterator{ public: ListIterator( const List* aList ); virtual void First(); virtual void Next(); virtual bool IsDone() const; virtual Item CurrentItem() const; // ...... private: const List * ptrList; long current;};

© Renato Conte - Design patterns - 51 / 67 -

Abstract Factory Patterncreazionale

detto anche Kit

Fornisce un’interfaccia per la creazione di famiglie di oggetti correlati o dipendenti senza specificare le rispettive classi concrete

© Renato Conte - Design patterns - 52 / 67 -

Motivazioni di Abstract Factory Pattern

Talvolta abbiamo sistemi che supportano differenti rappresentazioni dipendenti da fattori esterni.

Questo pattern provvede un’interfaccia per il client, così il client può ottenere uno specifico oggetto attraverso questa interfaccia astratta.

Per esempio:• quando un sistema deve poter essere configurato scegliendo tra più famiglie di prodotti• quando un sistema deve essere indipendente dalla modalità di rappresentazione dei suoi prodotti

© Renato Conte - Design patterns - 53 / 67 -

Abstract Factory Pattern

AbstractFactory

CreateProductA()CreateProductB()

ConcreteFactory1 ConcreteFactory2 ProductA1 ProductA2

AbstractProductA

Client

ProductB1 ProductB2

AbstractProductB

CreateProductA()CreateProductB()

CreateProductA()CreateProductB()

© Renato Conte - Design patterns - 54 / 67 -

Esempio di Abstract Factory Pattern

WidgetFactory

CreateScrollBar()CreateWindow()

Create Window() CreateScrollBar()

Create Window() CreateScrollBar()

Motif WidgetFactory PMWidgetFactory PMWindow MotifWindow

Window

Client

PMScrollBar MotifScrollBar

ScrollBar

{ instantiate }

{ instantiate }UNIX GUI

IBM Pres.Man.

© Renato Conte - Design patterns - 55 / 67 -

Partecipanti di Abstract Factory Pattern

• Abstract Factory ( WidgetFactory ):– Dichiara una interfaccia per le operazioni astratte di creazione di

oggetti prodotto.• Concrete Factory ( MotifWidgetFactory, PMWidgetFactory ):

– Implementa le operazioni di creazione degli oggetti• Abstract Product ( Window, ScrollBar ):

– Dichiara un’interfaccia per un generico prodotto• Concrete Product( PMWindow, PMScrollBar, MotifWidgeWindow, ... ):

– Definisce un oggetto prodotto che dovrà essere creato dalla corrispondente Factory concreta. (Implementa la Abstract Product interface).

• Client: – Usa solo le interfacce (o classi astratte) Abstract Factory e Abstract

Product

© Renato Conte - Design patterns - 56 / 67 -

Observer Patterncomportamentale

detto anche Dependents, Publish-Subscribe

Definisce una dipendenza uno a molti tra oggetti, in modo tale che se un oggetto cambia il suo stato tutti gli oggetti dipendenti da questo sono aggiornati automaticamente

© Renato Conte - Design patterns - 57 / 67 -

Observer Pattern

Un effetto collaterale al partizionamento di un sistema in gruppi di classi collaboranti, è il bisogno di mantenere un buon livello di consistenza tra le classi correlate.

La consistenza, però, non deve essere ottenuta a scapito dell’accoppiamento, che deve mantenersi basso, altrimenti la riusabilità viene compromessa

Con l’observer pattern si mantiene un alto livello di disaccoppiamento

© Renato Conte - Design patterns - 58 / 67 -

Esempio di problema da risolvere con l’Observer Pattern

a b c60

yx

503030

2010

z 801010 a b ca

bc

a = 50%b = 30%c = 20%

notifica di modifica

richieste di modifiche

Interfaccia utenteInterfaccia utente

Struttura datiStruttura dati

Subject

© Renato Conte - Design patterns - 59 / 67 -

Struttura dell’Observer Pattern

SubjectAttach(Observer)Detach(Observer)

Notify( )Notify( )

ConcreteSubject

subjectState

GetState()SetState()

for all o in observers { o -> Update( ); }

ObserverUpdate( )Update( )

ConcreteObserver

Update( )observerState =subject->GetState()

observerState

return subjectState

1..*

• un soggetto può avere un qualsiasi numero di osservatori dipendenti• tutti gli osservatori sono avvertiti quando il soggetto cambia di stato

Updateinterface

subject

© Renato Conte - Design patterns - 60 / 67 -

Esempio di Observer Pattern

SubjectAttach(Observer)Detach(Observer)

Notify( )

ClockTimer

time

GetTime( )SetTime( )

Tick( )

for all o in observers { o -> Update( ); }

ObserverUpdate( )

AnalogClock

Call Notify()

1..*

Updateinterface

DigitalClock

Update( )

observerState

Update( )

observerState observerState =subject->GetTime()

© Renato Conte - Design patterns - 61 / 67 -

Codice C++

class Observer { public: virtual ~ Observer(); virtual void Update( Subject* theChangedSubject ) = 0;protected: Observer( );};

class Subject { public: virtual ~Subject(); virtual void Attach( Observer* ); virtual void Detach( Observer* ); virtual void Notify( );protected: Subject();private: List <Observer*> * listObservers;};

© Renato Conte - Design patterns - 62 / 67 -

Codice C++

void Subject::Attach (Observer* o) { listObservers->Append(o);}

void Subject::Detach (Observer* o) { listObservers ->Remove(o);}

void Subject::Notify () { ListIterator<Observer*> i ( listObservers );

for (i.First(); ! i.IsDone(); i.Next()) { i.CurrentItem()->Update(this); }

}

© Renato Conte - Design patterns - 63 / 67 -

Collaborazioni (diag.seq.)

SetState( )

Notify( )

GetState( )

Update( )

Update( )

GetState( )

aConcreteSubject aConcreteObserver anotherConcreteObserver

abc

a b c

a = 50%b = 30%c = 20%

© Renato Conte - Design patterns - 64 / 67 -

Partecipanti di Observer Pattern• Subject:

– Conosce i suoi numerosi osservatori (observers).– Possiede una interfaccia per aggiungere e togliere “oggetti osservatore”– Invia un “avviso” ai suoi osservatori quando il suo stato cambia.

• Observer: – Definisce una interfaccia per l’aggiornamento per gli osservatori concreti.

• Concrete Subject:– Memorizza lo stato che interessa gli osservatori

• Concrete Observer:– Mantiene una referenza all’oggetto Subject – memorizza lo stato che si mantiene consistente con lo stato del Subject.– Implementa l’interfaccia di notifica.

© Renato Conte - Design patterns - 65 / 67 -

Bibliografia

Gamma, Erich Richard Helm, Ralph Johnson, John Vlissides (GoF):“Design PatternsDesign Patterns” Reading, Massachusetts: Addison-Wesley. 1995Edizione italiana: Addison-Wesley. Pearson education Italia. 2002

Grady Booch, James Rumbaugh, Ivar Jacobson““The Unified Modeling Language Reference Manual”The Unified Modeling Language Reference Manual” , Addison Wesley, (1999).

Ivar Jacobson, Grady Booch, James Rumbaugh ““The Unified Software Development Process”The Unified Software Development Process”,Addison Wesley, (1999).

© Renato Conte - Design patterns - 66 / 67 -

Riferimenti nel WebInformazioni varieInformazioni varie: Hillside Patterns Home Page http://hillside.net/patterns

PLoP PLoP (Pattern Languages of Programs Conference)http://jerry.cs.uiuc.edu/~plop/

OOPSLA OOPSLA (Conference On Object-Oriented Programming, Systems, Languages and Applications)(l’indirizzo cambia di anno in anno)www.cis.uab.edu/info/OOPSLA-DSM03/

TutorialTutorialwww.cs.wustl.edu/~schmidt/tutorials-patterns.htmlhttp://st-www.cs.uiuc.edu/users/patterns/patterns.html

OMG UML - OMG UML - UML Reference manual www.www.omgomg.org/.org/umluml//

© Renato Conte - Design patterns - 67 / 67 -

Riferimenti nel Web

Linda Rising's bookLinda Rising's book The Pattern Almanachttp://www.awlonline.com/product

wikiwikihttp://c2.com/cgi-bin/wiki

PatternPattern Depot Depothttp://www.patterndepot.com/put/8

Open directoryOpen directory http://www.dmoz.org/Computers/Programming/Patterns_and_Anti-Patterns/