Lezione 12 - Observer
-
Upload
marco-bianchi -
Category
Education
-
view
527 -
download
1
description
Transcript of Lezione 12 - Observer
Ingegneria del Software
Introduzione al pattern…
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?
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.
Presentazione del pattern 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
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
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
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.
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 capireche un oggetto ha cambiato stato senza dare dettagli sul cometale 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 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.
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
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?