Observer / Beobachter
Design Pattern & Refactoring - Julian Hirt
Motivation
• System aus interagierenden Klassen
• Konsistenz
• Keine enge Kopplung
Beispiel
A = 20
B = 17
C = 4
Beispiel
A = 20 B = 17
C = 4 Benachrichtigen Anfragen
Beobachter
Subjekt
Anwendbarkeit
• Abstraktion mit zwei Aspekten
• Änderung eines Objekts verlangt Änderung eines anderen Objekts
• Objekt soll andere Objekte benachrichtigen
Struktur
Konsequenzen
• Abstrakte Kopplung zwischen Subjekt und Beobachter
• keine enge Kopplung
• Schichtenkonzept wird nicht verletzt
• Unterstützung von Broadcast-Kommunikation
• Unerwartete Aktualisierungen
Beispielimplementierung in PHP5 - I
interface Subject{
public function register_observer(Observer $observer);
public function remove_observer(Observer $observer);
public function notify();
}
class MySubject implements Subject{
private $observers = array();
private $value;
public function register_observer(Observer $observer){
$this->observers[] = $observer;
}
public function remove_observer(Observer $observer){
$offset = array_search($observer, $this->observers);
$this->observers = array_splice($this->observers, $offset, 1);
}
public function notify(){
foreach($this->observers as $observer) {
$observer->update($this->value);
} }
public function setValue($value){
$this->value = $value;
$this->notify();
} }
Beispielimplementierung in PHP5 - II
interface Observer{
public function update($value);
}
class MyObserver1 implements Observer {
public function __construct(Subject $subject){
$subject->register_observer($this);
}
public function update($value){
print "I'm observer 1 and value is ".$value."\n";
} }
class MyObserver2 implements Observer {
public function __construct(Subject $subject){
$subject->register_observer($this);
}
public function update($value){
print "I'm observer 2 and value is ".$value."\n";
} }
$mySubject = new MySubject();
$myObserver1 = new MyObserver1($mySubject);
$myObserver2 = new MyObserver2($mySubject);
Beispielimplementierung in JAVA
public class ObserverAnwendung {
public static void main(String[] args) { Subjekt s = new Subjekt();
Beobachter b = new Beobachter();
s.addObserver(b);
s.setValue("Observer Test");
} }
import java.util.Observable;
public class Subjekt extends Observable { private String value;
public void setValue(String s) { this.value = s;
setChanged();
notifyObservers(this.value);
} }
import java.util.Observer;
import java.util.Observable;
class Beobachter implements Observer {
public void update(Observable o, Object str) {
System.out.println("update: " + str.toString());
} }