Im vorherigen Artikel „Verstehen Sie den Adaptermodus in PHP in einem Artikel“ haben wir den Adaptermodus in PHP vorgestellt. Dieser Artikel führt Sie zum Verständnis des Beobachtermodus in PHP.
Beobachter, es scheint, dass diese Figur in vielen Science-Fiction-Werken vorkommt. Beispielsweise reisen Beobachter in einer meiner liebsten amerikanischen Fernsehserien, „Fringe“, ständig durch Zeit und Raum, um verschiedene Personen oder Dinge aufzunehmen. Allerdings steht der Beobachter im Entwurfsmuster nicht nur daneben und schaut zu. Der Beobachter ergreift hier entsprechende Maßnahmen entsprechend den Zustandsänderungen, die am Subjekt auftreten.
GoF-Definition: Definieren Sie eine Eins-zu-Viele-Abhängigkeitsbeziehung zwischen Objekten, werden alle davon abhängigen Objekte benachrichtigt und automatisch aktualisiert
GoF-Klassendiagramm:
Code-Implementierung
interface Observer { public function update(Subject $subject): void; }
Über die abstrakte Schnittstelle des Beobachters gibt es nichts zu sagen, sie ermöglicht Ihnen lediglich die Implementierung eines bestimmten Updates
class ConcreteObserver implements Observer { private $observerState = ''; function update(Subject $subject): void { $this->observerState = $subject->getState(); echo '执行观察者操作!当前状态:' . $this->observerState; } }
Bestimmte Beobachter implementieren das Update( ) Methode. Hier erhalten wir die Subject-Klasse, damit wir deren Status ermitteln können. Die übergeordnete Subject-Klasse verwaltet ein Beobachter-Array und verfügt dann über Methoden zum Hinzufügen, Löschen und Durchlaufen dieses Arrays. Der Zweck besteht darin, dieses Array bequem zu verwalten alle Beobachter
class Subject { private $observers = []; private $stateNow = ''; public function attach(Observer $observer): void { array_push($this->observers, $observer); } public function detach(Observer $observer): void { $position = 0; foreach ($this->observers as $ob) { if ($ob == $observer) { array_splice($this->observers, ($position), 1); } ++$position; } } public function notify(): void { foreach ($this->observers as $ob) { $ob->update($this); } } }
Die Implementierungsklasse von Subject aktualisiert nur den Status. Wenn sich dieser Status ändert, wird die Beobachter-Traversal-Methode aufgerufen, um die update()-Operation aller Beobachtungen durchzuführen.
Observer Tatsächlich führt sie eine Aktualisierung durch ) allein, und Subject kann Beobachter stapelweise ausführen. Bitte beachten Sie, dass wir keinen Code in der Zielklasse ändern müssen, sondern ihn nur von außen hinzufügen müssen. Lassen Sie das Ziel also vom Beobachter entkoppelt sein. Sie müssen sich nicht um die Situation des anderen kümmernVollständiger Code: https://github.com/zhangyue0503/designpatterns-php/blob/master/06.observer/source/observer.php
Beispiel
-Modell. Man kann sagen, dass dieser Modus der Upgrade-Modus von Beobachtern ist. In dieser Artikelserie wird nicht auf Details eingegangen, aber Sie können einen Blick auf die Aspekte „Veröffentlichen und Abonnieren“ und „Ereignisüberwachung“ in Laravel werfen. Verkauftes Klassendiagramm bestellen
Vollständiger Quellcode: https://github.com/zhangyue0503/designpatterns-php/blob/master/06.observer/source/order-observer.php
class ConcreteSubject extends Subject{ public function setState($state) { $this->stateNow = $state; $this->notify(); } public function getState() { return $this->stateNow; } }
SPL-Erweiterung implementiert Observer-Muster – vollständiger Quellcode: https://github.com/zhangyue0503/designpatterns-php/blob/master/06.observer/source/spl_observer.php
- Wir halten uns nicht vollständig an das GoF-Klassendiagramm, es muss jedoch nicht vollständig eingehalten werden.
- Der Bestellstatus ändert sich durch den Verkauf. Methode Rufen Sie schließlich direkt die Notify-Methode auf, um den Beobachter aufzurufen. Das Senden von Textnachrichten und das Senden von Push-Nachrichten können von Beobachtern einzeln getrennt und implementiert werden. Diese Beobachter verfügen nicht unbedingt nur über diese Methode, sondern solange sie eine gemeinsame Methode implementieren Schnittstelle, es wird in Ordnung sein.
- Produktinventar und Nachrichtenversand sind eigentlich zwei völlig unabhängige Klassen, aber sie müssen nur dieselbe Schnittstelle implementieren.
- PHPs SPL-Erweiterung hat eine Reihe von Beobachterschnittstellen für uns vorbereitet Probieren Sie es aus, die Verwendung des nativ unterstützten Beobachtermodus kann viel Ärger ersparen!
Dieser Artikel ist eine Reproduktion von : https://juejin.cn/post/6844903930262978574PHP-Video-TutorialAutor: Hardcore Project Manager
Empfohlenes Lernen: „
Das obige ist der detaillierte Inhalt vonEine eingehende Analyse des Beobachtermusters in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!