Heim > Artikel > Backend-Entwicklung > Detaillierte Erklärung des PHP-Beobachtermusters
Dieser Artikel stellt hauptsächlich die detaillierte Erklärung des PHP-Beobachtermodus vor. Ich hoffe, dass er für alle hilfreich ist.
1. Absicht
Definieren Sie eine Eins-zu-Viele-Abhängigkeitsbeziehung zwischen Objekten, wenn sich der Zustand eines Objekts ändert Alle Objekte werden benachrichtigt und automatisch aktualisiert [GOF95]
Auch bekannt als Publish-Subscribe-Modus, Model-View-Modus, Source-Listener-Modus oder Slave-Dependents-Modus
2. Strukturdiagramm des Beobachtermodus
3. Die Hauptrollen im Beobachtermuster Abstraktes Thema (Subjekt-)Rolle: Die Subjektrolle speichert alle Verweise auf Beobachterobjekte in einer Sammlung. Jedes Subjekt kann eine beliebige Anzahl von Beobachtern haben. Das abstrakte Thema bietet eine Schnittstelle zum Hinzufügen und Entfernen von Beobachterobjekten.
Rolle des abstrakten Beobachters: Definieren Sie eine Schnittstelle für alle konkreten Beobachter und aktualisieren Sie sich selbst, wenn sich das Thema der Beobachtung ändert.
Rolle des konkreten Subjekts (ConcreteSubject): Speichern Sie den relevanten Status in einem bestimmten Beobachterobjekt. Wenn sich der interne Status eines bestimmten Subjekts ändert, wird eine Benachrichtigung an alle registrierten Beobachter gesendet. Konkrete Themenrollen werden normalerweise mithilfe einer konkreten Unterklasse implementiert.
Konkrete Beobachterrolle: Speichert ein bestimmtes Subjektobjekt, speichert zugehörige Zustände und implementiert die von der abstrakten Beobachterrolle benötigte Aktualisierungsschnittstelle, um ihren eigenen Zustand mit dem Zustand des Subjekts konsistent zu halten.
Vor- und Nachteile des Beobachtermusters
Vorteile des Beobachtermusters: 1. Der Grad der Kopplung zwischen dem Beobachter und dem Subjekt kleiner;
2. Unterstützt Broadcast-Kommunikation;
Nachteile des Beobachtermodus: Da der Beobachter die Existenz anderer Beobachter nicht kennt, kann dies einen negativen Einfluss auf das Finale haben Kosten für die Zieländerung sind nicht bekannt. Dies kann zu unerwarteten Updates führen.
5. Anwendbare Szenarien des Beobachtermusters 1. Wenn ein abstraktes Modell zwei Aspekte hat, von denen einer vom anderen abhängt.
2. Wenn die Änderung eines Objekts gleichzeitig die Änderung anderer Objekte erfordert, ist nicht bekannt, wie viele Objekte geändert werden müssen.
3. Wenn ein Objekt andere Objekte benachrichtigen muss, kann es nicht davon ausgehen, wer die anderen Objekte sind. Mit anderen Worten: Sie möchten nicht, dass diese Objekte eng miteinander verbunden sind.
6. Beobachtermuster und andere Muster Mediatormuster: Durch die Kapselung komplexer Aktualisierungssemantik fungiert ChangeManager als Bindeglied zwischen dem Ziel und dem Beobachter zwischen.
Singleton-Modus (Singleton-Modus): ChangeManager kann den Singleton-Modus verwenden, um sicherzustellen, dass er eindeutig und global zugänglich ist.
7. PHP-Beispiel für den Beobachtermodus
<?php /** * 抽象主题角色 */ interface Subject { /** * 增加一个新的观察者对象 * @param Observer $observer */ public function attach(Observer $observer); /** * 删除一个已注册过的观察者对象 * @param Observer $observer */ public function detach(Observer $observer); /** * 通知所有注册过的观察者对象 */ public function notifyObservers(); } /** * 具体主题角色 */ class ConcreteSubject implements Subject { private $_observers; public function __construct() { $this->_observers = array(); } /** * 增加一个新的观察者对象 * @param Observer $observer */ public function attach(Observer $observer) { return array_push($this->_observers, $observer); } /** * 删除一个已注册过的观察者对象 * @param Observer $observer */ public function detach(Observer $observer) { $index = array_search($observer, $this->_observers); if ($index === FALSE || ! array_key_exists($index, $this->_observers)) { return FALSE; } unset($this->_observers[$index]); return TRUE; } /** * 通知所有注册过的观察者对象 */ public function notifyObservers() { if (!is_array($this->_observers)) { return FALSE; } foreach ($this->_observers as $observer) { $observer->update(); } return TRUE; } } /** * 抽象观察者角色 */ interface Observer { /** * 更新方法 */ public function update(); } class ConcreteObserver implements Observer { /** * 观察者的名称 * @var <type> */ private $_name; public function __construct($name) { $this->_name = $name; } /** * 更新方法 */ public function update() { echo 'Observer', $this->_name, ' has notified.<br />'; } } /** * 客户端 */ class Client { /** * Main program. */ public static function main() { $subject = new ConcreteSubject(); /* 添加第一个观察者 */ $observer1 = new ConcreteObserver('Martin'); $subject->attach($observer1); echo '<br /> The First notify:<br />'; $subject->notifyObservers(); /* 添加第二个观察者 */ $observer2 = new ConcreteObserver('phppan'); $subject->attach($observer2); echo '<br /> The Second notify:<br />'; $subject->notifyObservers(); /* 删除第一个观察者 */ $subject->detach($observer1); echo '<br /> The Third notify:<br />'; $subject->notifyObservers(); } } Client::main(); ?>
Zusammenfassung: Das Obige ist der gesamte Inhalt dieses Artikels, ich hoffe, dass er für das Lernen aller hilfreich sein wird.
Verwandte Empfehlungen:
Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung des PHP-Beobachtermusters. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!