SlideShare una empresa de Scribd logo
1 de 17
Descargar para leer sin conexión
Ingegneria del Software
Introduzione al pattern…
Problema introduttivo

 • Una fabbrica di sensori anti-incendio, di movimento e altri
   tipi di dispositivi di sicurezza produce una nuova linea di
   prodotti.
 • I dispositivi possono inviare un segnale ad una scheda
   hardware che può essere istallata su molti computer.
   Le schede possono inviare segnali di tipo: Alarm, Low Power
   e Diagnostic.
 • Per poter sviluppare software di controllo che utilizzano tali
   dispositivi è necessario fornire API semplici da utilizzare e
   che siano facilmente integrabili nei programmi di controllo
   già esistenti.
 • I software di controllo reagiscono ai segnali dei sensori
   invocando i metodi opportuni (es. allarmeIncendio())

  Come progettare le API in modo tale che ad un segnale
  Come progettare le API in modo tale che ad un segnale
venga associato un insieme di operazioni non note a priori?
venga associato un insieme di operazioni non note a priori?
                     Ingegneria del Software - A.A. 2003/2004
Soluzione al problema introduttivo




Nota:
Il pattern Adapter converte l’interfaccia di una classe in un’altra
interfaccia più “comoda” per il client. Il pattern permette di far
lavorare insieme delle classi altrimenti incompatibili.

                    Ingegneria del Software - A.A. 2003/2004
Presentazione del pattern
        Observer
Il pattern Observer (1/11)


•   Nome       Observer
               Originariamente presentato nel [GoF95], il
               pattern si è evoluto nel tempo.

•   Synopsis   Consente di definire la dipendenza di molti
               oggetti verso di uno, in modo che se quest’ultimo
               cambia il suo stato tutti gli altri sono avvisati e
               aggiornati automaticamente.

•   Context    cfr. esempio introduttivo




                     Ingegneria del Software - A.A. 2003/2004
Il pattern Observer (2/11)


                 Class                                              Class
•   Forces   -                  s                             o
                   S                                                  O

             Le classi S e O non sono progettate per lavorare
             insieme e non hanno conoscenza diretta l’una
             dell’altra.

             -   Class                                        o1   Class
                  S1
                               s                                    O1
                   :                                          :      :
                 Class                                        :    Class
                  Sn
                               s                                    On
                                                              on



                   Ingegneria del Software - A.A. 2003/2004
Il pattern Observer (3/11)


                       Contratto che regola
                       le modalità di iscrizione
Solution               e rimozione degli
                       osservatori


 Contratto che
 regola le
 modalità di
 notifica




                                    Gestore delle
                                    registrazioni e
                                    delle notifiche

                     Ingegneria del Software - A.A. 2003/2004
Il pattern Observer (4/11)

•   Solution - Gli attori del pattern Observer sono:
–    ObserverIF: Interfaccia che definisce un metodo tipicamente chiamato
    notify o update. Un oggetto Observable richiama questo metodo quando
    intende notificare il cambiamento del suo stato, passando se previsto un
    argomento. In molti casi l’argomento passato è un riferimento che identifica
    l’oggetto Observable che ha richiamato il metodo
–   Observer: Le istanze di questa classe ricevono le notifiche di cambiamento
    di stato degli oggetti Observable
–   ObservableIF: Interfaccia che definisce i metodi necessari alla registrazione
    e de-registrazione degli oggetti Observer
–    Observable: Classe di oggetti in grado di notificare i loro cambiamenti di
    stato a tutti gli oggetti interessati
–    Multicaster: Le sue istanze che gestisce le registrazioni di un oggetto
    ObserverIF e le notifiche verso Observable. Delegare queste
    responsabilità a Multicaster favorisce la riusabilità del codice.




                          Ingegneria del Software - A.A. 2003/2004
Il pattern Observer (5/11)


Fase di registrazione




Fase di notifica




                   Ingegneria del Software - A.A. 2003/2004
Il pattern Observer (6/11)


•   Consequences

    - Permette ad un oggetto di inoltrare notifiche ad altri oggetti
    senza che queste si conoscano a priori.

    - Situazioni indesiderabili:
         - Tempi di notifica troppo lunghi:
                 - Observer direttamente registrati troppo numerosi
                 - Observer indirettamente interessati “troppo lontani”
         - Dipendenze cicliche (rischio di StackOverFlowError)

    - Pattern semplice ed elegante fin quando una notifica fa capire
      che un oggetto ha cambiato stato senza dare dettagli sul come
      tale stato è cambiato.



                        Ingegneria del Software - A.A. 2003/2004
Il pattern Observer (7/11)


•   Implementation

    - In molti casi l’oggetto Observer, dopo aver ricevuto una
    notifica, ha bisogno di accedere agli attributi dell’oggetto
    Observable. In questi casi si può:
    a) Aggiungere appositi metodi in ObservableIF
    b) Passare per parametro nel metodo notify() gli attributi
       interessanti
    c) Passare per parametro nel metodo notify() l’intero
       l’oggetto Observable

•   Java API usage

    Il modello ad eventi di Java è una forma specializzata del
    pattern Observer.


                     Ingegneria del Software - A.A. 2003/2004
Il pattern Observer (8/11)

•   Code example

    /** Classes that implement this interface can register to receive
    * security notifications from SecurityNotifier objects.      */

    public interface SecurityObserver
                      SecurityObserver            {

        public final int ALARM = 1;
        public final int LOW_POWER = 2;
        public final int DIAGNOSTIC = 3;

        public void notify(int device, int event);
    }




                      Ingegneria del Software - A.A. 2003/2004
Il pattern Observer (9/11)

import java.util.ArraySet;
import java.util.Iterator;
/** When an instance of this class receives a notification from a
 * security device, it passes it on to all of its registered observers. */
class SecurityNotifier {
   private ArraySet observers = new ArraySet();
   //...
   public void addObserver(SecurityObserver observer) {
     observers.add(observer);
   }
   public void removeObserver(SecurityObserver observer) {
     observers.remove(observer);
   }
   private void notify(int device, int event) {
     Iterator iterator = observers.iterator();
     while (iterator.hasNext()) {
         ((SecurityObserver)iterator.next()).notify(device, event);
    }
  }
}
                          Ingegneria del Software - A.A. 2003/2004
Il pattern Observer (10/11)

/** Instances of this class receive a notification from an object that is can only
* deliver it to an object the implements the SecurityObserver interface and
* apsses it on to a SecurityMonitor object that does not implemen SecurityObserver. */

   class SecurityAdapter implements SecurityObserver {
         private SecurityMonitor sm;
         SecurityAdapter(SecurityMonitor sm) {
                  this.sm = sm;
         }
         public void notify(int device, int event) {
                  switch (event) {
                            case ALARM:
                                               sm.securityAlert(device);
                                               break;
                            case LOW_POWER:
                            case DIAGNOSTIC:
                                               sm.diagnosticAlert(device);
                                               break;
                  }
         }
   }
                             Ingegneria del Software - A.A. 2003/2004
Il pattern Observer (11/11)



•   Related Patterns

    Adapter, Delegation, Mediator, Publisher-Subscriber




                       Ingegneria del Software - A.A. 2003/2004
Domande?




Ingegneria del Software - A.A. 2003/2004

Más contenido relacionado

Similar a Lezione 12 - Observer

Lezione 11 - Visitor
Lezione 11 - VisitorLezione 11 - Visitor
Lezione 11 - VisitorMarco Bianchi
 
Lezione 09 - Abstract Factory
Lezione 09 - Abstract FactoryLezione 09 - Abstract Factory
Lezione 09 - Abstract FactoryMarco Bianchi
 
Sistemi Context-aware: Esercitazione 3
Sistemi Context-aware: Esercitazione 3Sistemi Context-aware: Esercitazione 3
Sistemi Context-aware: Esercitazione 3Marco Loregian
 
Lezione 01 - Singleton
Lezione 01 - SingletonLezione 01 - Singleton
Lezione 01 - SingletonMarco Bianchi
 
Acadevmy - Angular Overview
Acadevmy - Angular OverviewAcadevmy - Angular Overview
Acadevmy - Angular OverviewFrancesco Sciuti
 
Progetto ELI4U - Milestone 50% - WP7 - Attività 11 - Comune di Milano
Progetto ELI4U - Milestone 50% - WP7 - Attività 11 - Comune di MilanoProgetto ELI4U - Milestone 50% - WP7 - Attività 11 - Comune di Milano
Progetto ELI4U - Milestone 50% - WP7 - Attività 11 - Comune di MilanoProgettoELI4U
 
Lezione 13 - Strategy
Lezione 13 - StrategyLezione 13 - Strategy
Lezione 13 - StrategyMarco Bianchi
 
Real Spring Aop Recipes For Your Everyday Job
Real Spring Aop Recipes For Your Everyday JobReal Spring Aop Recipes For Your Everyday Job
Real Spring Aop Recipes For Your Everyday JobMassimiliano Dessì
 
Sviluppo di un'applicazione ibrida su dispositivo mobile per l'interfacciamen...
Sviluppo di un'applicazione ibrida su dispositivo mobile per l'interfacciamen...Sviluppo di un'applicazione ibrida su dispositivo mobile per l'interfacciamen...
Sviluppo di un'applicazione ibrida su dispositivo mobile per l'interfacciamen...Mattia De Bernardi
 
Sviluppo di una piattaforma CLIENT/SERVER per attività didattiche basate su AR
Sviluppo di una piattaforma CLIENT/SERVER per attività didattiche basate su ARSviluppo di una piattaforma CLIENT/SERVER per attività didattiche basate su AR
Sviluppo di una piattaforma CLIENT/SERVER per attività didattiche basate su ARGiacomo Giovanni Delfini
 
Sviluppo di una piattaforma Client/Server per attività didattiche basate su R...
Sviluppo di una piattaforma Client/Server per attività didattiche basate su R...Sviluppo di una piattaforma Client/Server per attività didattiche basate su R...
Sviluppo di una piattaforma Client/Server per attività didattiche basate su R...Giacomo Delfini
 
PLC: lo standard iec61131 3
PLC: lo standard iec61131 3PLC: lo standard iec61131 3
PLC: lo standard iec61131 3Italiandirectory
 
festival ICT 2013: Sicurezza delle applicazioni web
festival ICT 2013: Sicurezza delle applicazioni webfestival ICT 2013: Sicurezza delle applicazioni web
festival ICT 2013: Sicurezza delle applicazioni webfestival ICT 2016
 
Webbit 2004: Tiger, java
Webbit 2004: Tiger, javaWebbit 2004: Tiger, java
Webbit 2004: Tiger, javaMatteo Baccan
 
Sistemi Context-aware: Esercitazione 4
Sistemi Context-aware: Esercitazione 4Sistemi Context-aware: Esercitazione 4
Sistemi Context-aware: Esercitazione 4Marco Loregian
 
Acadevmy - AngularDay 2018 - Change Detection, Zone.js ed altri mostri
Acadevmy - AngularDay 2018 - Change Detection, Zone.js ed altri mostriAcadevmy - AngularDay 2018 - Change Detection, Zone.js ed altri mostri
Acadevmy - AngularDay 2018 - Change Detection, Zone.js ed altri mostriFrancesco Sciuti
 

Similar a Lezione 12 - Observer (20)

Lezione 11 - Visitor
Lezione 11 - VisitorLezione 11 - Visitor
Lezione 11 - Visitor
 
Lezione 09 - Abstract Factory
Lezione 09 - Abstract FactoryLezione 09 - Abstract Factory
Lezione 09 - Abstract Factory
 
Sistemi Context-aware: Esercitazione 3
Sistemi Context-aware: Esercitazione 3Sistemi Context-aware: Esercitazione 3
Sistemi Context-aware: Esercitazione 3
 
Lezione 01 - Singleton
Lezione 01 - SingletonLezione 01 - Singleton
Lezione 01 - Singleton
 
Acadevmy - Angular Overview
Acadevmy - Angular OverviewAcadevmy - Angular Overview
Acadevmy - Angular Overview
 
Owasp Day 3
Owasp Day 3Owasp Day 3
Owasp Day 3
 
Progetto ELI4U - Milestone 50% - WP7 - Attività 11 - Comune di Milano
Progetto ELI4U - Milestone 50% - WP7 - Attività 11 - Comune di MilanoProgetto ELI4U - Milestone 50% - WP7 - Attività 11 - Comune di Milano
Progetto ELI4U - Milestone 50% - WP7 - Attività 11 - Comune di Milano
 
Lezione 13 - Strategy
Lezione 13 - StrategyLezione 13 - Strategy
Lezione 13 - Strategy
 
Cac Es3 2009
Cac Es3 2009Cac Es3 2009
Cac Es3 2009
 
Real Spring Aop Recipes For Your Everyday Job
Real Spring Aop Recipes For Your Everyday JobReal Spring Aop Recipes For Your Everyday Job
Real Spring Aop Recipes For Your Everyday Job
 
U4J2RSF
U4J2RSFU4J2RSF
U4J2RSF
 
Sviluppo di un'applicazione ibrida su dispositivo mobile per l'interfacciamen...
Sviluppo di un'applicazione ibrida su dispositivo mobile per l'interfacciamen...Sviluppo di un'applicazione ibrida su dispositivo mobile per l'interfacciamen...
Sviluppo di un'applicazione ibrida su dispositivo mobile per l'interfacciamen...
 
Iec61499
Iec61499Iec61499
Iec61499
 
Sviluppo di una piattaforma CLIENT/SERVER per attività didattiche basate su AR
Sviluppo di una piattaforma CLIENT/SERVER per attività didattiche basate su ARSviluppo di una piattaforma CLIENT/SERVER per attività didattiche basate su AR
Sviluppo di una piattaforma CLIENT/SERVER per attività didattiche basate su AR
 
Sviluppo di una piattaforma Client/Server per attività didattiche basate su R...
Sviluppo di una piattaforma Client/Server per attività didattiche basate su R...Sviluppo di una piattaforma Client/Server per attività didattiche basate su R...
Sviluppo di una piattaforma Client/Server per attività didattiche basate su R...
 
PLC: lo standard iec61131 3
PLC: lo standard iec61131 3PLC: lo standard iec61131 3
PLC: lo standard iec61131 3
 
festival ICT 2013: Sicurezza delle applicazioni web
festival ICT 2013: Sicurezza delle applicazioni webfestival ICT 2013: Sicurezza delle applicazioni web
festival ICT 2013: Sicurezza delle applicazioni web
 
Webbit 2004: Tiger, java
Webbit 2004: Tiger, javaWebbit 2004: Tiger, java
Webbit 2004: Tiger, java
 
Sistemi Context-aware: Esercitazione 4
Sistemi Context-aware: Esercitazione 4Sistemi Context-aware: Esercitazione 4
Sistemi Context-aware: Esercitazione 4
 
Acadevmy - AngularDay 2018 - Change Detection, Zone.js ed altri mostri
Acadevmy - AngularDay 2018 - Change Detection, Zone.js ed altri mostriAcadevmy - AngularDay 2018 - Change Detection, Zone.js ed altri mostri
Acadevmy - AngularDay 2018 - Change Detection, Zone.js ed altri mostri
 

Lezione 12 - Observer

  • 3. Problema introduttivo • Una fabbrica di sensori anti-incendio, di movimento e altri tipi di dispositivi di sicurezza produce una nuova linea di prodotti. • I dispositivi possono inviare un segnale ad una scheda hardware che può essere istallata su molti computer. Le schede possono inviare segnali di tipo: Alarm, Low Power e Diagnostic. • Per poter sviluppare software di controllo che utilizzano tali dispositivi è necessario fornire API semplici da utilizzare e che siano facilmente integrabili nei programmi di controllo già esistenti. • I software di controllo reagiscono ai segnali dei sensori invocando i metodi opportuni (es. allarmeIncendio()) Come progettare le API in modo tale che ad un segnale Come progettare le API in modo tale che ad un segnale venga associato un insieme di operazioni non note a priori? venga associato un insieme di operazioni non note a priori? Ingegneria del Software - A.A. 2003/2004
  • 4. Soluzione al problema introduttivo Nota: Il pattern Adapter converte l’interfaccia di una classe in un’altra interfaccia più “comoda” per il client. Il pattern permette di far lavorare insieme delle classi altrimenti incompatibili. Ingegneria del Software - A.A. 2003/2004
  • 6. Il pattern Observer (1/11) • Nome Observer Originariamente presentato nel [GoF95], il pattern si è evoluto nel tempo. • Synopsis Consente di definire la dipendenza di molti oggetti verso di uno, in modo che se quest’ultimo cambia il suo stato tutti gli altri sono avvisati e aggiornati automaticamente. • Context cfr. esempio introduttivo Ingegneria del Software - A.A. 2003/2004
  • 7. Il pattern Observer (2/11) Class Class • Forces - s o S O Le classi S e O non sono progettate per lavorare insieme e non hanno conoscenza diretta l’una dell’altra. - Class o1 Class S1 s O1 : : : Class : Class Sn s On on Ingegneria del Software - A.A. 2003/2004
  • 8. Il pattern Observer (3/11) Contratto che regola le modalità di iscrizione Solution e rimozione degli osservatori Contratto che regola le modalità di notifica Gestore delle registrazioni e delle notifiche Ingegneria del Software - A.A. 2003/2004
  • 9. Il pattern Observer (4/11) • Solution - Gli attori del pattern Observer sono: – ObserverIF: Interfaccia che definisce un metodo tipicamente chiamato notify o update. Un oggetto Observable richiama questo metodo quando intende notificare il cambiamento del suo stato, passando se previsto un argomento. In molti casi l’argomento passato è un riferimento che identifica l’oggetto Observable che ha richiamato il metodo – Observer: Le istanze di questa classe ricevono le notifiche di cambiamento di stato degli oggetti Observable – ObservableIF: Interfaccia che definisce i metodi necessari alla registrazione e de-registrazione degli oggetti Observer – Observable: Classe di oggetti in grado di notificare i loro cambiamenti di stato a tutti gli oggetti interessati – Multicaster: Le sue istanze che gestisce le registrazioni di un oggetto ObserverIF e le notifiche verso Observable. Delegare queste responsabilità a Multicaster favorisce la riusabilità del codice. Ingegneria del Software - A.A. 2003/2004
  • 10. Il pattern Observer (5/11) Fase di registrazione Fase di notifica Ingegneria del Software - A.A. 2003/2004
  • 11. Il pattern Observer (6/11) • Consequences - Permette ad un oggetto di inoltrare notifiche ad altri oggetti senza che queste si conoscano a priori. - Situazioni indesiderabili: - Tempi di notifica troppo lunghi: - Observer direttamente registrati troppo numerosi - Observer indirettamente interessati “troppo lontani” - Dipendenze cicliche (rischio di StackOverFlowError) - Pattern semplice ed elegante fin quando una notifica fa capire che un oggetto ha cambiato stato senza dare dettagli sul come tale stato è cambiato. Ingegneria del Software - A.A. 2003/2004
  • 12. Il pattern Observer (7/11) • Implementation - In molti casi l’oggetto Observer, dopo aver ricevuto una notifica, ha bisogno di accedere agli attributi dell’oggetto Observable. In questi casi si può: a) Aggiungere appositi metodi in ObservableIF b) Passare per parametro nel metodo notify() gli attributi interessanti c) Passare per parametro nel metodo notify() l’intero l’oggetto Observable • Java API usage Il modello ad eventi di Java è una forma specializzata del pattern Observer. Ingegneria del Software - A.A. 2003/2004
  • 13. Il pattern Observer (8/11) • Code example /** Classes that implement this interface can register to receive * security notifications from SecurityNotifier objects. */ public interface SecurityObserver SecurityObserver { public final int ALARM = 1; public final int LOW_POWER = 2; public final int DIAGNOSTIC = 3; public void notify(int device, int event); } Ingegneria del Software - A.A. 2003/2004
  • 14. Il pattern Observer (9/11) import java.util.ArraySet; import java.util.Iterator; /** When an instance of this class receives a notification from a * security device, it passes it on to all of its registered observers. */ class SecurityNotifier { private ArraySet observers = new ArraySet(); //... public void addObserver(SecurityObserver observer) { observers.add(observer); } public void removeObserver(SecurityObserver observer) { observers.remove(observer); } private void notify(int device, int event) { Iterator iterator = observers.iterator(); while (iterator.hasNext()) { ((SecurityObserver)iterator.next()).notify(device, event); } } } Ingegneria del Software - A.A. 2003/2004
  • 15. Il pattern Observer (10/11) /** Instances of this class receive a notification from an object that is can only * deliver it to an object the implements the SecurityObserver interface and * apsses it on to a SecurityMonitor object that does not implemen SecurityObserver. */ class SecurityAdapter implements SecurityObserver { private SecurityMonitor sm; SecurityAdapter(SecurityMonitor sm) { this.sm = sm; } public void notify(int device, int event) { switch (event) { case ALARM: sm.securityAlert(device); break; case LOW_POWER: case DIAGNOSTIC: sm.diagnosticAlert(device); break; } } } Ingegneria del Software - A.A. 2003/2004
  • 16. Il pattern Observer (11/11) • Related Patterns Adapter, Delegation, Mediator, Publisher-Subscriber Ingegneria del Software - A.A. 2003/2004