Lezione 12 - Observer

17
Ingegneria del Software

description

 

Transcript of Lezione 12 - Observer

Page 1: Lezione 12 - Observer

Ingegneria del Software

Page 2: Lezione 12 - Observer

Introduzione al pattern…

Page 3: Lezione 12 - Observer

Ingegneria del Software - A.A. 2003/2004

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 Powere 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 venga associato un insieme di operazioni non note a priori?

Come progettare le API in modo tale che ad un segnale venga associato un insieme di operazioni non note a priori?

Page 4: Lezione 12 - Observer

Ingegneria del Software - A.A. 2003/2004

Soluzione al problema introduttivo

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

Page 5: Lezione 12 - Observer

Presentazione del pattern Observer

Page 6: Lezione 12 - Observer

Ingegneria del Software - A.A. 2003/2004

Il pattern Observer (1/11)

• Nome ObserverOriginariamente 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

Page 7: Lezione 12 - Observer

Ingegneria del Software - A.A. 2003/2004

Il pattern Observer (2/11)

ClassS1

ClassSn

:

ClassO1

ClassOn

:

• Forces -

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

-

ClassO

ClassS os

o1s::

son

Page 8: Lezione 12 - Observer

Ingegneria del Software - A.A. 2003/2004

Il pattern Observer (3/11)

Solution

Contratto che regola le modalità di notifica

Contratto che regola le modalità di iscrizionee rimozione degli osservatori

Gestore delle registrazioni edelle notifiche

Page 9: Lezione 12 - Observer

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 distato 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.

Page 10: Lezione 12 - Observer

Ingegneria del Software - A.A. 2003/2004

Il pattern Observer (5/11)

Fase di registrazione

Fase di notifica

Page 11: Lezione 12 - Observer

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 capireche un oggetto ha cambiato stato senza dare dettagli sul cometale stato è cambiato.

Page 12: Lezione 12 - Observer

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 ObservableIFb) Passare per parametro nel metodo notify() gli attributi

interessantic) 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.

Page 13: Lezione 12 - 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 {

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

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

SecurityObserver

Page 14: Lezione 12 - Observer

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);}

}}

Page 15: Lezione 12 - Observer

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;

}}

}

Page 16: Lezione 12 - Observer

Ingegneria del Software - A.A. 2003/2004

Il pattern Observer (11/11)

• Related Patterns

Adapter, Delegation, Mediator, Publisher-Subscriber

Page 17: Lezione 12 - Observer

Ingegneria del Software - A.A. 2003/2004

Domande?