UNIVERSITA DEGLI STUDI ROMA TRE DIPARTIMENTO DI FISICA

  • Slides: 24
Download presentation
UNIVERSITA’ DEGLI STUDI ROMA TRE DIPARTIMENTO DI FISICA “E. AMALDI” laboratorio di calcolo II

UNIVERSITA’ DEGLI STUDI ROMA TRE DIPARTIMENTO DI FISICA “E. AMALDI” laboratorio di calcolo II AA 2003/04 nona settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza 159 - tel. (06 5517) 7281 www. fis. uniroma 3. it/~orestano@fis. uniroma 3. it 1

Design Patterns Soluzioni per problemi ricorrenti di disegno del software. Il testo di riferimento

Design Patterns Soluzioni per problemi ricorrenti di disegno del software. Il testo di riferimento (avanzato!): Design Patterns, Elements of Reusable Object. Oriented Software, di Gamma, Helm, Johnson e Vlissides, edito da Addison-Wesley Si distinguono 3 tipi di strutture (patterns): • creazionali (Creational Patterns): factory, singleton. . . • strutturali (Structural Patterns): composite. . . • funzionali (Behavioral Patterns): strategy, observer, visitor. . . 2

Elenco (da www. dofactory. com) Creational Patterns Abstract Factory Creates an instance of several

Elenco (da www. dofactory. com) Creational Patterns Abstract Factory Creates an instance of several families of classes Builder Separates object construction from its representation Factory Method Creates an instance of several derived classes Prototype A fully initialized instance to be copied or cloned Singleton A class of which only a single instance can exist 3

Elenco (da www. dofactory. com) Structural Patterns Adapter Match interfaces of different classes Bridge

Elenco (da www. dofactory. com) Structural Patterns Adapter Match interfaces of different classes Bridge Separates an object’s interface from its implementation Composite A tree structure of simple and composite objects Decorator Add responsibilities to objects dynamically Façade A single class that represents an entire subsystem Flyweight Proxy A fine-grained instance used for efficient sharing An object representing another object 4

Elenco (da www. dofactory. com) Behavioral Patterns Chain of Resp. A way of passing

Elenco (da www. dofactory. com) Behavioral Patterns Chain of Resp. A way of passing a request between a chain of objects Command Encapsulate a command request as an object Interpreter A way to include language elements in a program Iterator Sequentially access the elements of a collection Mediator Defines simplified communication between classes Memento Capture and restore an object's internal state Observer A way of notifying change to a number of classes State Alter an object's behavior when its state changes Strategy Encapsulates an algorithm inside a class Template Method Defer the exact steps of an algorithm to a subclass Visitor Defines a new operation to a class without change 5

Factory (method) Struttura creazionale che consente di disaccoppiare l’utilizzo di un oggetto dalla sua

Factory (method) Struttura creazionale che consente di disaccoppiare l’utilizzo di un oggetto dalla sua creazione. Grazie all’ereditarietà e al polimorfismo un client (ad esempio il programma main o un altro oggetto) può manipolare un oggetto derivato dipendendo (e quindi includendo la dichiarazione!) solo dalla classe base. La dipendenza (e quindi la necessità di includere l’header file) dalla classe derivata è indispensabile solo per la costruzione degli oggetti. Esempio: nel problema del sistema solare il client Sistema. Solare tratta solo dei Corpi. Celesti. La classe Sonda è nota solo al main che costruisce esplicitamente gli oggetti. L’uso di una factory consentirebbe di spostare la dipendenza da Sonda rendendo anche il client main dipendente solo dalla classe base e dalla factory. 6

Factory: diagramma UML main corpo. Celeste crea. Corpo. Celeste: Corpo. Celeste crea. Sonda: Corpo.

Factory: diagramma UML main corpo. Celeste crea. Corpo. Celeste: Corpo. Celeste crea. Sonda: Corpo. Celeste crea. Satellite: Corpo. Celeste Sonda Di solito è una classe astratta Satellite 7

Singleton Struttura creazionale che consente di assicurarsi che di una classe esista un’unica istanza

Singleton Struttura creazionale che consente di assicurarsi che di una classe esista un’unica istanza (un unico oggetto) e che ne fornisce un accesso globale (da qualsiasi blocco del programma). Serve per realizzare una struttura dati visibile da tutto il programma e garantirne l’unicità. Si realizza rendendo privato il costruttore della classe Singleton, mantenendo tra gli attributi un puntatore all’oggetto stesso e fornendo un metodo pubblico che costruisca l’oggetto qualora questo ancora non esista e ne restituisca sempre il puntatore. L’attributo puntatore e il metodo che lo restituisce devono essere dichiarati static per garantire l’accesso globale ad un puntatore che deve assumere sempre lo stesso valore. 8

Singleton: diagramma UML user_code() { Singleton: : instance()->specific. Service(. . . ); } 9

Singleton: diagramma UML user_code() { Singleton: : instance()->specific. Service(. . . ); } 9

Composite Permette di descrivere oggetti organizzati gerarchicamente in strutture ad albero trattando in modo

Composite Permette di descrivere oggetti organizzati gerarchicamente in strutture ad albero trattando in modo uniforme oggetti singoli e composti attraverso un’unica interfaccia. La composizione può essere ricorsiva. 10

Esempio: esperimento ARGO-YBJ L’implementazione mediante una catena di aggregazioni porterebbe a duplicazioni di codice

Esempio: esperimento ARGO-YBJ L’implementazione mediante una catena di aggregazioni porterebbe a duplicazioni di codice e sarebbe inefficiente 11

Composite: diagramma UML 12

Composite: diagramma UML 12

Composite: diagramma UML di ARGO-YBJ 13

Composite: diagramma UML di ARGO-YBJ 13

Esempio: calcolo della potenza dissipata in un rack di moduli di elettronica 14

Esempio: calcolo della potenza dissipata in un rack di moduli di elettronica 14

15

15

Uso di Composite 16

Uso di Composite 16

class Daq. Composite; // forward declaration class Daq. Component { public: Daq. Component() :

class Daq. Composite; // forward declaration class Daq. Component { public: Daq. Component() : parent_(0) {} virtual float power() const=0 protected: Daq. Composite * parent_; }; Daq. Component. h #include “Daq. Component. h” class Daq. Leaf: public Daq. Component { public: Daq. Leaf(float ip=0): power_(ip) {} Daq. Leaf. h float power() const { return power_; } protected: float power_; }; 17

#include “Daq. Component. h” class Daq. Composite : public Daq. Component { public: typedef

#include “Daq. Component. h” class Daq. Composite : public Daq. Component { public: typedef vector<Daq. Component *> VC; typedef VC: : const_iterator CIter; Daq. Composite(){} float power() const { tp =0; CIter p=components. begin(); CIter pe=components. end(); while (p!=pe) {tp+=(*p)->power(); ++p; } return tp; } protected: VC components; }; Daq. Composite. h 18

Strategy Consente di prevedere l’uso di diversi algoritmi concreti, alternativi tra loro, facendo dipendere

Strategy Consente di prevedere l’uso di diversi algoritmi concreti, alternativi tra loro, facendo dipendere il client solo da una classe algoritmica astratta. L’algoritmo da eseguire può essere scelto a run-time e si possono introdurre nuovi algoritmi senza modificare il client. 19

Strategy: diagramma UML 20

Strategy: diagramma UML 20

Observer Definisce una relazione tra oggetti che consente di notificare la variazione dello stato

Observer Definisce una relazione tra oggetti che consente di notificare la variazione dello stato di un oggetto a tutti gli altri in modo automatico. Si usa quando due oggetti devono evolvere in modo correlato, quando non si sappia quanti oggetti devono essere modificati in seguito alla variazione di stato di un oggetto o quando non si vogliano introdurre vincoli stretti tra di essi. Lo stato dell’Observer dipende dallo stato del Subject. Il Subject notifica a tutti gli Observer registrati che il suo stato è cambiato. Ogni Observer si aggiorna in maniera che dipende dall’implementazione concreta. 21

Observer: diagramma UML 22

Observer: diagramma UML 22

Visitor Permette di aggiungere funzionalità ad una classe senza modificarne la struttura. Si usa

Visitor Permette di aggiungere funzionalità ad una classe senza modificarne la struttura. Si usa quando si hanno delle classi che definiscono la struttura degli oggetti la cui interfaccia deve essere “congelata” e si vuole mantenere la possibilità di aggiungervi dei metodi, quando tali metodi servono solo nell’ambito di alcune applicazioni e non si vuole quindi appesantire la struttura nelle altre, quando le operazioni da compiere nelle diverse classi concrete sono differenti. L’oggetto visitato ha un metodo che, ricevendo il puntatore di un visitor, invoca un metodo del visitor passandogli il puntatore a se stesso e rendendo quindi tale metodo equivalente ad un membro 23 della classe.

Visitor: diagramma UML 24

Visitor: diagramma UML 24