Tutorial: Observer-Pattern (Beobachter-Entwurfsmuster) in PHP

In meinem heutigen Blogpost geht es nur am Rande um Social Media: Ich wurde neulich in eine Diskussion um das Obeserver-Pattern (Beobachter-Entwurfsmuster, Details siehe z. B. bei Wikipedia) in PHP verwickelt und wurde um ein einfaches Beispiel gebeten. Hier ist es nun – zumindest so, wie ich es verstehe (Kritik ist wie immer willkommen).

In dem folgenden Beispiel gibt es eine Klasse „News“, in der die jeweils „neueste Nachricht“ abgelegt wird. Eine im Vorfeld nicht bekannte Anzahl an Social Network Clients (Klasse SocialNetworkClients) sollen informiert werden, wenn sich die neueste Nachricht ändert (um z. B. dann diese Nachricht in diesen Netzwerken zu publizieren). Dies kann mit Hilfe des Observer-Patterns umgesetzt werden. Zuerst wird dafür die Klasse „News“ angelegt – noch ohne jede besondere Einstellung für eine „beobachtbare“ Klasse:

class News
{             
  private $neuesteNachricht;

  function setNeuesteNachricht($nachricht)
  {
    $this->neuesteNachricht=$nachricht;
  }
               
  function getNeuesteNachricht()               
  {
     return $this->neuesteNachricht;
  }             
}

Jetzt kommt die Besonderheit dazu, so dass sich diese Klasse „beobachten“ lässt: Mit Hilfe der Methode addObserver() und einem Array kann sich die Klasse ihre Beobachter speichern.

private $observers=array();

public function addObserver($observer)
{
  $this->observers[]=$observer;
}

Und so sieht das nun in der Anwendung aus:

$twitter=new SocialNetworkClient();
$facebook=new SocialNetworkClient();

$news=new News();

$news->addObserver($twitter);
$news->addObserver($facebook);

Aber noch fehlt eine entscheidende Einstellung in der Klasse News – wird die „neueste Nachricht“ mit Hilfe der Methode setNeuesteNachricht()gesetzt, müssen alle Beobachter informiert werden. Dafür wird die Methode wie folgt geändert und eine Methode notifyObserver() ergänzt:

function setNeuesteNachricht($nachricht)
{
  $this->neuesteNachricht=$nachricht;
  $this->notifyObservers();
}

private function notifyObservers()
{
  foreach($this->observers as $observer)
  {
     $observer->notify($this);
  }
}

Wie zu erkennen ist, müssen Beobachter also über die Methode notify() verfügen – hier werden diese über Änderungen informiert. Die Klasse SocialNetworkClient könnte also ungefähr so aussehen:

class SocialNetworkClient
{

//...

  public function notify(News $news)
  {
    echo "<div>Neue Nachricht in News: ";
    echo $news->getNeuesteNachricht();
    echo "</div>";
  }

  //...

}

Das war’s. Als praktische Erweiterung ist noch denkbar, die Methode notify() noch um ein Argument $notifyEvent oder $notivyMessage zu ergänzen, mit der man den „Beobachtern“ mitteilen kann, um welchen Typ von Änderung es sich handelt (z. B. „NEU“, „AKTUALISIERUNG“ oder „LÖSCHUNG“).

Hier gibt es den kompletten Code als Download.

P.S.

Probleme? Fragen? Anregungen? Ich helfe jederzeit und gerne  – einfach einen Kommentar oder Mail schreiben, die Antwort kommt schnellstmöglich. Unternehmen, die Unterstützung, Beratung oder Schulung bei der API- oder Webprogrammierung, der Social-Media-Entwicklung oder dem Social-Media-Management benötigen finden zudem entsprechende Angebote meiner Firma auf der Website www.Frank-IT-Beratung.de

Dieser Beitrag wurde unter PHP, Programmierung abgelegt und mit , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Kommentar verfassen

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.