Observer

Aus php bar

Wechseln zu: Navigation, Suche

Beim Observer handelt es sich prinzipiell um eine simple Variante des "Event dispatcher" pattern. Es wird benötigt wenn Objekte andere Objekte quasi "überwachen" sollen.

Man hat so die Möglichkeit Zustandsänderungen sofort zu erkennen und darauf zu reagieren.

Für gewöhnlich werden hierfür 2 interfaces erstellt.

Wozu das ganze?

Nunja, bei kleineren Objektstrukturen kommt man sicherlich ohne aus, allerdings wächst von größe der Struktur auch die größe an Dingen die passieren können. Das Problem liegt hauptsächlich in der flexibilität!

Jeder der Event-Programmierung kennt weiß es zu schätzen einfach auf ein bestimmtes Ereigniss zu warten.

Beispiel

Hier ein Beispiel mit einem Auto:

Das auto hat einen Tank. Immer wenn das Auto einen km fährt verbraucht es einen Liter Benzin..
Es soll nun eine kleine "Digitale" anzeige warnen, wenn zu viel Teibstoff verbraucht wird.
Diese wird aber nachträglich eingebaut und somit wird nichts am Auto selber geaendert.

 interface observer {
   public function update(Observeable $Subject);
 }
 
 interface observeable {
   public function attach(Observer $Observer);
   public function detach(Observer $Observer);
   public function notify();
 }
10 class auto implements observeable
11 {
12   private $_Observers = Array();
13 
14   //.... Eigenschaften vom auto ...
15   // ...
16   public $Tank = 100;
17 
18   public function attach(Observer $Observer)
19   {
20     $this->_Observers[] = $Observer;
21   }
22   public function detach(Observer $Observer)
23   {
24     $this->_Observers = array_diff($this->_Observers, Array($Observer));
25   }
26   public function notify()
27   {
28     foreach($this->_Observers as $Observer)
29        $Observer->update($this);
30   }
31 
32   public function fahr($strecke)
33   {
34      if($this->Tank < 1)
35         echo "Auto kann so nicht fahren :( Leider kein Tank ... <br/>";
36      
37      $this->notify(); // Anzeige beobachten... 
38 
39      echo "auto soll $strecke km fahren...<br/>";
40      // pro km verbraucht das auto 1l Tank
41      $tankNeu = $this->Tank - $strecke;
42      if($tankNeu <0)
43      {
44          $stecke = $this->Tank;
45          $tankNeu = 0;   
46          echo "Auto ist nach $this->Tank liegengeblieben :/... WIESO passt keiner auf die Anzeige auf?!?!?<br/>";
47 
48      }
49      else {
50          echo "Auto ist gefahren ... (Noch ".($this->Tank-$strecke)." Liter im Tank ...)<br/>";  
51      } 
52      $this->Tank = $tankNeu;
53     }
54 }
55 
56 class superMegaAutomatischerTankBeobachter implements Observer
57 {
58    public function update(Observeable $Subject)
59    {
60        if($Subject->Tank == 0)
61           echo "ALARM: TANK IST LEER <br/>";
62        if($Subject->Tank < 5)
63        {
64           echo "ALARM: Bald Kein Tank mehr!!! Tank wird wieder gefuellt <br/>";
65           $Subject->Tank = 100;
66        }
67    } 
68 }
69 
70 
71 $Auto = new Auto;
72 $Auto->fahr(50);
73 $Auto->fahr(48); // Nun wird es knapp
74 $Auto->fahr(5);
75 
76 echo "<h1>Nun mit Tank beobachtung...</h1>";
77 $Auto2 = new Auto;
78 $Auto2->attach(new superMegaAutomatischerTankBeobachter);
79 $Auto2->fahr(50);
80 $Auto2->fahr(48);
81 $Auto2->fahr(5);


Ausgabe

 auto soll 50 km fahren...
 Auto ist gefahren ... (Noch 50 Liter im Tank ...)
 auto soll 48 km fahren...
 Auto ist gefahren ... (Noch 2 Liter im Tank ...)
 auto soll 5 km fahren...
 Auto ist nach 2 km liegengeblieben :/... WIESO passt keiner auf die Anzeige auf?!?!?
 Nun mit Tank beobachtung...
 auto soll 50 km fahren...
 Auto ist gefahren ... (Noch 50 Liter im Tank ...)
10 auto soll 48 km fahren...
11 Auto ist gefahren ... (Noch 2 Liter im Tank ...)
12 ALARM: Bald Kein Tank mehr!!! Tank wird wieder gefuellt
13 auto soll 5 km fahren...
14 Auto ist gefahren ... (Noch 95 Liter im Tank ...)
Persönliche Werkzeuge