Softwaretechnik http://kohnlehome.de/informatik/observer.pdf
Design Pattern: Observer (Beobachter)
1 Designprinzip
Bei ¨Anderung des Zustands (bzw. der Daten) des Subjekts werden alle Beobachter benachrichtigt.
Das Subjekt braucht die Struktur der Beobachter nicht zu kennen.
Es gibt zwei Varianten:
• PUSH: Die Daten werden bei der Benachrichtigung der Beobachter gleich mitgeliefert.
• PULL: Die Nachricht vom Subjekt an die Beobachter enth¨alt noch nicht die Daten, sondern nur die Nachricht, dass sich diese ge¨andert haben. Die Beobachter m¨ussen dann selbst die von ihnen ben¨otigten Daten anfordern.
2 Java-Code
2.1 Subject (Observable)
public c l a s s S u b j e c t {
// M e m b e r v a r i a b l e n f u e r Daten private i n t d a t e n = 0 ;
// L i s t e von B e o b a c h t e r n
private A r r a y L i s t<B e o b a c h t e r S c h n i t t s t e l l e> b e o b a c h t e r
= new A r r a y L i s t<B e o b a c h t e r S c h n i t t s t e l l e>( ) ;
// B e o b a c h t e r muessen s i c h r e g i s t r i e r e n
public void r e g i s t r i e r e n ( B e o b a c h t e r S c h n i t t s t e l l e b ){ b e o b a c h t e r . add ( b ) ;
}
// a l l e B e o b a c h t e r e r h a l t e n Aenderungsmeldung private void b r o a d c a s t ( ){
f o r (i n t i = 0 ; i < b e o b a c h t e r . s i z e ( ) ; i ++) { b e o b a c h t e r . g e t ( i ) . update ( ) ;
// b e i PUSH: Daten a l s Argumente u e b e r g e b e n }
}
// Methoden zum L e s e z u g r i f f a u f Daten b e i PULL public i n t g e t D a t e n ( ) {
return d a t e n ; }
// B r o a d c a s t b e i Aenderung d e r Daten public void s e t D a t e n (i n t n ) {
d a t e n = n ; b r o a d c a s t ( ) ; }
}
Franz Kohnle Seite 1 von 2 5. November 2017
Softwaretechnik http://kohnlehome.de/informatik/observer.pdf
2.2 Beobachterschnittstelle (Observer)
public i n t e r f a c e B e o b a c h t e r S c h n i t t s t e l l e {
public void update ( ) ; // Bei PUSH: Daten a l s Parameter }
2.3 Konkrete Beobachter
public c l a s s BeobachterA implements B e o b a c h t e r S c h n i t t s t e l l e{ private S u b j e c t s u b j e c t ;
public BeobachterA ( S u b j e c t s u b j e c t ) { t h i s. s u b j e c t = s u b j e c t ;
s u b j e c t . r e g i s t r i e r e n (t h i s) ; }
@Override
public void update ( ) {
// b e i PUSH: Daten werden a l s Parameter u e b e r g e b e n // b e i PULL : Daten muessen e x t r a g e h o l t werden i n t d a t e n = s u b j e c t . g e t D a t e n ( ) ;
System . o ut . p r i n t l n ( ”A: ” + d a t e n ) ; }
}
public c l a s s BeobachterB implements B e o b a c h t e r S c h n i t t s t e l l e{ private S u b j e c t s u b j e c t ;
public BeobachterB ( S u b j e c t s u b j e c t ) { t h i s. s u b j e c t = s u b j e c t ;
s u b j e c t . r e g i s t r i e r e n (t h i s) ; }
@Override
public void update ( ) {
// b e i PUSH: Daten werden a l s Parameter u e b e r g e b e n // b e i PULL : Daten muessen e x t r a g e h o l t werden i n t d a t e n = s u b j e c t . g e t D a t e n ( ) ;
System . o ut . p r i n t l n ( ”B : ” + d a t e n ) ; }
}
2.4 Verwendung des Subjekts
S u b j e c t s u b j e c t = new S u b j e c t ( ) ;
BeobachterA b e o b a c h t e r A = new BeobachterA ( s u b j e c t ) ; BeobachterB b e o b a c h t e r B = new BeobachterB ( s u b j e c t ) ; s u b j e c t . s e t D a t e n ( 5 ) ; // Ausgabe : ”A: 5 B: 5 ”
Literatur
[Head First Design Patterns] http://www.oreilly.de/catalog/9780596007126/
[Wikipedia] http://de.wikipedia.org/wiki/Observer_(Entwurfsmuster)
Franz Kohnle Seite 2 von 2 5. November 2017