| Weitere Artikel aus dem Webentwickler Blog |
| Teilen |
Datenbankprogrammierung - PHP - Grundlagen
Das Subject/Observer-Muster in PHP
Das Subject/Observer -Entwurfsmuster gehört zur Gruppe der Verhaltensmuster. Dieses Entwurfsmuster ist aufgeteilt in einen Beobachter ( Observer ) und ein Subjekt ( Subject ), das überwacht werden soll. Das Entwurfsmuster definiert dabei eine Eins-zu-n -Abhängigkeit zwischen einem Subjekt und beliebig vielen Beobachtern. Wenn sich der Zustand des Objekts ändert, werden die unabhängigen Objekte automatisch benachrichtigt.
Die Konventionen für das Subject/Observer-Modell
- Subject - Definiert die Schnittstelle für das zu überwachende Objekt.
- Observer - Definiert die Schnittstelle für die Überwacherobjekte.
- ConcreteSubject- Enthält die konkrete Objekt-Implementierung des zu überwachenden Objekts.
- ConcreteObserver - Enthält die konkrete Objekt-Implementierung für die Überwacherobjekte.
Um ein Subject/Observer-Entwurfsmuster in PHP zu implementieren, führen Sie folgende Schritte durch:
1. Definieren Sie eine Schnittstelle für die Observer, die eine Methode bereitstellt, mit der die Beobachter über eine Statusänderung informiert werden können.
2. Definieren Sie eine Schnittstelle für die zu beobachtenden Objekte (Subjects). Diese Schnittstelle muss das Hinzufügen sowie das Entfernen von Observern erlauben und eine Methode notify() fordern, mit der die Observer über eine Statusänderung informiert werden.
3. Implementieren Sie im zu beobachtenden Objekt die Subject-Schnittstelle.
4. Fügen Sie in den Methoden, die den Zustand des Objekts ändern, den Aufruf der notify()-Methode ein.
5. Implementieren Sie konkrete Objekte.
Wenn Sie diese Schritte befolgen, steht dem Einsatz von Subject/Observer-Entwurfsmustern nichts im Wege.
Beispieldatei PersonalLift.php
<?php
require_once 'Fahrstuhl.php';
require_once 'Subject.php';
class PersonalLift implements Fahrstuhl, Subject
{
protected $hersteller;
protected $model;
protected $meter;
protected $generatorAktiv = false;
protected $observers = array();
public function __construct($hersteller, $model, $meter = 0)
{
$this->hersteller = $hersteller;
$this->model = $model;
$this->meter = $meter;
}
public function __destruct()
{
if ($this->generatorAktiv)
{
$this->stopGenerator();
}
}
public function startGenerator()
{
$this->generatorAktiv = true;
}
public function fahren($meter)
{
if ($this->generatorAktiv !== true)
{
return false;
}
$this->meter = $this->meter + $meter;
$this->notify();
return true;
}
public function stopGenerator()
{
$this->generatorAktiv = false;
}
public function getHersteller()
{
return $this->hersteller;
}
public function getModel()
{
return $this->model;
}
public function getMeter()
{
return $this->meter;
}
public function attach(Observer $observer)
{
$this->observers[] = $observer;
}
public function detach(Observer $observer)
{
for ($i = 0; $i < sizeof($this->observers); $i++)
{
if ($this->observers[$i] === $observer)
{
unset($this->observers[$i]);
}
}
}
public function notify()
{
foreach ($this->observers as $observer)
{
$observer->update($this);
}
}
}
?>
Beispieldatei Fahrstuhl.php
<?php
interface Fahrstuhl
{
public function startGenerator();
public function fahren($meter);
public function stopGenerator();
public function getMeter();
public function getHersteller();
public function getModel();
}
?>
Beispieldatei Subject.php
<?php
interface Subject
{
public function attach(Observer $observer);
public function detach(Observer $observer);
public function notify();
}
?>
Beispieldatei Observer.php
Ganzen Artikel lesen...




































