Lezione 12 - Observer

697 views

Published on

Published in: Education, Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
697
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
31
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Lezione 12 - Observer

  1. 1. Ingegneria del Software
  2. 2. Introduzione al pattern…
  3. 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. 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
  5. 5. Presentazione del pattern Observer
  6. 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. 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. 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. 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. 10. Il pattern Observer (5/11) Fase di registrazione Fase di notifica Ingegneria del Software - A.A. 2003/2004
  11. 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. 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. 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. 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. 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. 16. Il pattern Observer (11/11) • Related Patterns Adapter, Delegation, Mediator, Publisher-Subscriber Ingegneria del Software - A.A. 2003/2004
  17. 17. Domande? Ingegneria del Software - A.A. 2003/2004

×