Observer (Beobachter)

Das Observer-Muster eröffnet ebenfalls einen Weg, um das feste Verkoppeln von Komponenten zu vermeiden. Das Muster ist einfach: Ein Objekt macht sich beobachtbar, indem es eine Methode hinzufügt, die es einem anderen Objekt, dem Observer, gestattet, sich zu registrieren. Wenn sich das beobachtbare Objekt ändert, sendet es eine Nachricht an die registrierten Observer. Was die Observer mit dieser Information machen, ist weder relevant noch wichtig für das beobachtbare Objekt. Das Ergebnis ist eine Möglichkeit für Objekte, miteinander zu sprechen, ohne unbedingt zu verstehen, warum.

class Beobachter {

    public function update(Fuehler $auto) {
        
        if($auto->tank <= 5) { echo "Bald Kein Benzin mehr. Ab zur Tankstelle.\n";
           $auto->tank = 100;
        }
    } 
 }
  
class Fuehler {

	private $observers = Array();
  	   
	public function ueberwache(Beobachter $observer) { 
		$this->observers[] = $observer; 
	}
   
   	public function benachrichtige() {
     foreach($this->observers as $observer) {
        $observer->update($this);
     }
   }
}

class Auto extends  Fuehler {
   
   public function __construct($tank) {
   	$this->tank = $tank;
   }
 
   public function fahre($km) {
   	
      $this->benachrichtige();  
      
      if(($this->tank - $km)  <= 0) { 
          echo "Das Auto ist nach ".$this->tank." km liegen geblieben.\n";
      } else {
          echo "Das Auto ist ".$km." gefahren, es hat noch ".($this->tank-$km)." Liter im Tank\n";  
      }   
      
      $this->tank = ($this->tank - $km) ;
     }
 }
 
$auto1 = new Auto(100);
$auto1->fahre(50);
$auto1->fahre(48);
$auto1->fahre(4);
// Auto ist 50 gefahren, es hat noch 50 Liter im Tank
// Auto ist 48 gefahren, es hat noch 2 Liter im Tank
// Auto ist nach 2 km liegengeblieben.
 
$auto2 = new Auto(100);
$auto2->ueberwache(new Beobachter);
$auto2->fahre(50);
$auto2->fahre(48);
$auto2->fahre(2);
$auto2->fahre(2);
// Auto ist 50 gefahren, es hat noch 50 Liter im Tank
// Auto ist 48 gefahren, es hat noch 2 Liter im Tank
// Bald Kein Benzin mehr. Ab zur Tankstelle.
// Auto ist 2 gefahren, es hat noch 98 Liter im Tank
// Auto ist 2 gefahren, es hat noch 96 Liter im Tank

Kommentare