Das Beobachtermuster verstehen
Kernpunkte
- Observer-Muster ist ein Verhaltensdesignmuster, das eine Eins-zu-Viele-Beziehung zwischen Objekten herstellt.
- Dieser Modus enthält ein Thema (oder Verlag) und Beobachter (oder Abonnenten). Das Subjekt informiert den Beobachter über eine Änderung des Status und der Beobachter kann entsprechend handeln. Dieser Modus fördert die lose Kopplung, wodurch das System flexibler und einfacher zu ändern oder erweitert wird. Die Observer -Klasse bietet eine
- -Methode, die das Subjekt fordert, um ihre Zustandsänderungen zu informieren. Die Hauptmethoden zur Definition von Themenklassen:
update()
,attach()
,detach()
undsetState()
werden verwendet, um Beobachter zu verwalten und sie über Statusänderungen zu informieren.notify()
Der Beobachtermodus eignet sich für Situationen, in denen Änderungen an einem Objekt Änderungen an anderen Objekten erfordern, insbesondere wenn die Anzahl der zu ändernden Objekte unbekannt ist. Es kann verwendet werden, um die Konsistenz zwischen verwandten Objekten aufrechtzuerhalten, ohne sie fest zu koppeln. Zum Beispiel wird es verwendet, um den Authentifizierungsmechanismus des Portals mit der Forum -Software zu verknüpfen, sodass Benutzer sich mit einem einzigen Anmeldung bei beiden anmelden können.
Beobachtermodus
Observer-Muster (auch als Publish-Subscribe-Muster bezeichnet) ist ein Verhaltensdesignmuster, das Eins-zu-Viele-Beziehungen zwischen Objekten definiert, sodass bei einem Objekt sein Zustand automatisch benachrichtigt und aktualisiert werden. In meinem Fall habe ich diesen Modus verwendet, um den Authentifizierungsmechanismus des Portals mit der Forum -Software zu verknüpfen. Das Verhalten der Anmeldung im Portal löst den Benutzer auch automatisch dazu, sich im Forum anzumelden. Objekte, die eine Eins-zu-Viele-Beziehung zu anderen Objekten haben, die an ihrem eigenen Zustand interessiert sind, werdenThema oder Publisher bezeichnet. Sein Abhängigkeitsobjekt wird als Observer oder Abonnent bezeichnet. Wenn sich der Zustand des Subjekts ändert, wird der Beobachter benachrichtigt und kann entsprechend handeln. Ein Thema kann eine beliebige Anzahl von abhängigen Beobachtern haben, die Benachrichtigungen an diese Beobachter senden, und eine beliebige Anzahl von Beobachtern kann sich dem Thema abonnieren, um solche Benachrichtigungen zu erhalten.
Beobachterkategorie Die Observer -Klasse bietet eine
-Methode, die das Subjekt anruft, um seine Zustandsänderungen zu informieren. In diesem Beispiel habe ich die update()
-Methode als spezifische Methode definiert. Wenn Sie möchten, können Sie die Methode hier als abstrakte Methode definieren und dann eine konkrete Implementierung in der Unterklasse des Beobachters bereitstellen. update()
<?php abstract class Observer { public function __construct($subject = null) { if (is_object($subject) && $subject instanceof Subject) { $subject->attach($this); } } public function update($subject) { // 查找具有状态名称的观察者方法 if (method_exists($this, $subject->getState())) { call_user_func_array(array($this, $subject->getState()), array($subject)); } } }
Methode akzeptiert Instanzen beobachtbarer Themen und verbindet sich dem Thema - ich werde später darüber sprechen. Die __construct()
-Methode ruft den aktuellen Stand des Themas ab und nutzt sie, um eine unterklassige Beobachtermethode mit demselben Zustandsnamen aufzurufen. In meinem speziellen Fall muss ich die vorhandene Auth -Klasse des Portals als beobachtbares Thema erstellen und eine konkrete Beobachter -Unterklasse erstellen, um eine Verbindung zum Authentifizierungscode des Forums herzustellen. Meine Unterklasse muss auch die Methode mit dem Status des Themas implementieren. update()
Themenkategorie Die Betreffklasse ist auch eine abstrakte Klasse, die vier Hauptmethoden definiert:
,, attach()
, detach()
und setState()
. Zur Bequemlichkeit habe ich auch die Methoden notify()
und getState()
hier hinzugefügt. getObservers()
<?php abstract class Subject { protected $observers; protected $state; public function __construct() { $this->observers = array(); $this->state = null; } public function attach(Observer $observer) { $i = array_search($observer, $this->observers); if ($i === false) { $this->observers[] = $observer; } } public function detach(Observer $observer) { if (!empty($this->observers)) { $i = array_search($observer, $this->observers); if ($i !== false) { unset($this->observers[$i]); } } } public function getState() { return $this->state; } public function setState($state) { $this->state = $state; $this->notify(); } public function notify() { if (!empty($this->observers)) { foreach ($this->observers as $observer) { $observer->update($this); } } } public function getObservers() { return $this->observers; } }
Methode zeichnet den Beobachter ein Thema ab, damit alle staatlichen Änderungen mitgeteilt werden können. Die attach()
-Methode beschreibt den Beobachter aus dem Thema, so dass es die Zustandsänderungen des Themas nicht mehr beobachtet. Die detach()
-Methode legt den aktuellen Status des Themas fest und ruft setState()
auf, um den Beobachter zu aktualisieren, dh eine Benachrichtigung an jeden Beobachter auszustellen. Die notify()
-Methoden aktualisieren jedes abonnierte Objekt, indem die interne Liste durch Iterien durch Iterien durchgeführt und die notify()
-Methode jedes Mitglieds aufgerufen wird. Die Methoden update()
und getState()
sind nur Helferfunktionen, die den Status des aktuellen Themas und die Observer -Liste zurückgeben. getObservers()
sorgfältig hinzufügen ... integrieren Sie
Jetzt mit der abstrakten Basisklasse für Beobachter und Themen konnte ich die Forum -Software in mein vorhandenes Webportal integrieren. Ich muss die Auth -Klasse des Portals so festlegen, dass es sich um beobachtbares Thema handelt, und seinen beobachtbaren Status festlegen, wenn sich der Benutzer anmeldet oder sich aus dem Portal anmeldet.
<?php class Auth extends Subject { function login() { // 执行登录身份验证的现有代码 // ... // 向任何观察者发出信号,表明用户已登录 $this->setState("login"); } function logout() { // 执行用户注销时执行某些操作的现有代码 // 例如销毁会话等... // 向任何观察者发出信号,表明用户已注销 $this->setState("logout"); } }
in den Methoden login()
und logout()
hinzugefügt. Um den Beobachter zu unterklassen, habe ich eine Auth_forumhook -Klasse erstellt, die dafür verantwortlich ist, die API -Anmeldungs- und Abmeldenfunktionen des Forums aufzurufen. setState()
<?php class Auth_ForumHook extends Observer { function login($subject) { // 调用论坛的 API 函数以登录用户 // ... } function logout($subject) { // 调用论坛的 API 函数以注销用户 // ... } }
<?php abstract class Observer { public function __construct($subject = null) { if (is_object($subject) && $subject instanceof Subject) { $subject->attach($this); } } public function update($subject) { // 查找具有状态名称的观察者方法 if (method_exists($this, $subject->getState())) { call_user_func_array(array($this, $subject->getState()), array($subject)); } } }
Dies sind alle meine zusätzlichen Codierungsbedürfnisse neben der Vorbereitung abstrakter Beobachter und Fachklassen. Alle Statusänderungen, die durch die Methoden von Auths login()
und logout()
ausgelöst werden, informieren den Beobachter des Auth_forumhooks und melden sich automatisch vom Benutzer im Forum an oder melden Sie sich automatisch an. So fügen Sie einen neuen Beobachter hinzu, um sich beispielsweise beim Tracker anzumelden, um aufzuzeichnen, wenn sich ein Benutzer anmeldet oder sich aus dem Portal anmeldet, einfach eine bestimmte Beobachterklasse angeben und es dem Auth -Thema anhängen, ohne die Methoden login()
und logout()
des vorhandenen Auth -Objekts weiter zu ändern.
Zusammenfassung
Wenn Sie mehrere Objekte haben, die von einem anderen Objekt abhängen und Operationen ausführen müssen, wenn sich der Status dieses Objekts ändert oder ein Objekt andere Objekte benachrichtigen muss, ohne zu wissen, wer oder wie viele sie sind, ist das Beobachtermuster ein geeignetes und anwendbares Designmuster. In diesem Artikel zeige ich Ihnen das grundlegende Thema des Themas und Beobachtungsmusters und stelle konkrete Beispiele für die einfache Erweiterung der Funktionalität einer vorhandenen Klasse mit diesem Verhaltensmuster an, ohne neue Anforderungen streng zu koppeln. Dieses Muster ermöglicht es Ihnen, eine höhere Konsistenz zwischen verwandten und abhängigen Objekten zu erreichen, ohne die Wiederverwendbarkeit Ihres Codes zu beeinträchtigen.
Bilder von Jpf / Shutterstock
(Der nachfolgende FAQs -Abschnitt wurde aufgrund der Länge des Artikels weggelassen. Der Kerninhalt wurde neu organisiert und poliert.)
Das obige ist der detaillierte Inhalt vonDas Beobachtermuster verstehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen











In PHP sollten die Funktionen für Passwort_Hash und passwart_verify verwendet werden, um sicheres Passwort -Hashing zu implementieren, und MD5 oder SHA1 sollte nicht verwendet werden. 1) Passwort_hash generiert einen Hash, der Salzwerte enthält, um die Sicherheit zu verbessern. 2) Passwort_Verify prüfen Sie das Passwort und sicherstellen Sie die Sicherheit, indem Sie die Hash -Werte vergleichen. 3) MD5 und SHA1 sind anfällig und fehlen Salzwerte und sind nicht für die Sicherheit der modernen Passwort geeignet.

PHP -Typ -Eingabeaufforderungen zur Verbesserung der Codequalität und der Lesbarkeit. 1) Tipps zum Skalartyp: Da Php7.0 in den Funktionsparametern wie int, float usw. angegeben werden dürfen. 3) Eingabeaufforderung für Gewerkschaftstyp: Da Php8.0 in Funktionsparametern oder Rückgabetypen angegeben werden dürfen. 4) Nullierstyp Eingabeaufforderung: Ermöglicht die Einbeziehung von Nullwerten und Handlungsfunktionen, die Nullwerte zurückgeben können.

PHP ist hauptsächlich prozedurale Programmierung, unterstützt aber auch die objektorientierte Programmierung (OOP). Python unterstützt eine Vielzahl von Paradigmen, einschließlich OOP, funktionaler und prozeduraler Programmierung. PHP ist für die Webentwicklung geeignet, und Python eignet sich für eine Vielzahl von Anwendungen wie Datenanalyse und maschinelles Lernen.

PHP eignet sich für Webentwicklung und schnelles Prototyping, und Python eignet sich für Datenwissenschaft und maschinelles Lernen. 1.PHP wird für die dynamische Webentwicklung verwendet, mit einfacher Syntax und für schnelle Entwicklung geeignet. 2. Python hat eine kurze Syntax, ist für mehrere Felder geeignet und ein starkes Bibliotheksökosystem.

PHP entstand 1994 und wurde von Rasmuslerdorf entwickelt. Es wurde ursprünglich verwendet, um Website-Besucher zu verfolgen und sich nach und nach zu einer serverseitigen Skriptsprache entwickelt und in der Webentwicklung häufig verwendet. Python wurde Ende der 1980er Jahre von Guidovan Rossum entwickelt und erstmals 1991 veröffentlicht. Es betont die Lesbarkeit und Einfachheit der Code und ist für wissenschaftliche Computer, Datenanalysen und andere Bereiche geeignet.

PHP bleibt im Modernisierungsprozess wichtig, da es eine große Anzahl von Websites und Anwendungen unterstützt und sich den Entwicklungsbedürfnissen durch Frameworks anpasst. 1.PHP7 verbessert die Leistung und führt neue Funktionen ein. 2. Moderne Frameworks wie Laravel, Symfony und Codesigniter vereinfachen die Entwicklung und verbessern die Codequalität. 3.. Leistungsoptimierung und Best Practices verbessern die Anwendungseffizienz weiter.

Zu den Kernvorteilen von PHP gehören einfacher Lernen, starke Unterstützung für Webentwicklung, reiche Bibliotheken und Rahmenbedingungen, hohe Leistung und Skalierbarkeit, plattformübergreifende Kompatibilität und Kosteneffizienz. 1) leicht zu erlernen und zu bedienen, geeignet für Anfänger; 2) gute Integration in Webserver und unterstützt mehrere Datenbanken. 3) leistungsstarke Frameworks wie Laravel; 4) hohe Leistung kann durch Optimierung erzielt werden; 5) mehrere Betriebssysteme unterstützen; 6) Open Source, um die Entwicklungskosten zu senken.

PhPhas significantantyPactedWebDevelopmentAndendendsbeyondit.1) iTpowersMAjorPlatforms-LikewordpressandExcelsInDatabaseInteractions.2) php'SadaptabilityAllowStoscaleForLargeApplicationsfraMe-Linien-Linien-Linien-Linienkripte
