Heim Backend-Entwicklung PHP-Tutorial Das Beobachtermuster verstehen

Das Beobachtermuster verstehen

Feb 28, 2025 am 09:14 AM

Understanding the Observer Pattern

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() und setState() 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.
Ich wurde kürzlich gebeten, eine Forum-Software von Drittanbietern in mein vorhandenes Webportal zu integrieren. Das Problem ist, dass beide Anwendungen ihre eigenen unabhängigen Authentifizierungsmechanismen haben. Aus Sicht des Benutzers können sich Benutzer im Idealfall beim Portal anmelden, ohne sich separat im Forum anzumelden. In diesem Fall möchte ich den Forum-Code nicht unnötig ändern, da dies Wartungsalptraum erstellt. Hier ist der Beobachtermodus für mich sehr bequem. In diesem Artikel werde ich Ihnen zeigen, wie Sie das Beobachtermuster implementieren. Sie erfahren, wie verschiedene Klassen im Muster als Themen und Beobachter miteinander zusammenhängen, wie Themen den Beobachter über Änderungen in ihrem Zustand informieren und wie Sie Szenarien identifizieren, die für die Verwendung des Beobachtermusters in Ihrem eigenen Code geeignet sind.

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, werden

Thema 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));
        }
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

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;
    }
}
Nach dem Login kopieren

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");
    }
}
Nach dem Login kopieren
Ich habe die Subjektklasse so erweitert, dass Auth so beobachtet werden kann, und dann einen Aufruf zu

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 函数以注销用户
        // ...
    }
}
Nach dem Login kopieren
Andere in der Codebasis, wobei die Auth -Klasse im Portal instanziiert ist, füge ich die auth_forumhook -Instanz an, damit der Beobachter über staatliche Änderungen in Auth.

<?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));
        }
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

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

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Apr 05, 2025 am 12:04 AM

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Was sind Aufzählungen (Enums) in PHP 8.1? Was sind Aufzählungen (Enums) in PHP 8.1? Apr 03, 2025 am 12:05 AM

Die Aufzählungsfunktion in Php8.1 verbessert die Klarheit und Type des Codes, indem benannte Konstanten definiert werden. 1) Aufzählungen können Ganzzahlen, Zeichenfolgen oder Objekte sein, die die Lesbarkeit der Code und die Type der Type verbessern. 2) Die Aufzählung basiert auf der Klasse und unterstützt objektorientierte Merkmale wie Traversal und Reflexion. 3) Die Aufzählung kann zum Vergleich und zur Zuordnung verwendet werden, um die Sicherheit der Typ zu gewährleisten. 4) Aufzählung unterstützt das Hinzufügen von Methoden zur Implementierung einer komplexen Logik. 5) Strenge Typ Überprüfung und Fehlerbehandlung können häufig auftretende Fehler vermeiden. 6) Die Aufzählung verringert den magischen Wert und verbessert die Wartbarkeit, achten Sie jedoch auf die Leistungsoptimierung.

Wie funktioniert die Session -Entführung und wie können Sie es in PHP mildern? Wie funktioniert die Session -Entführung und wie können Sie es in PHP mildern? Apr 06, 2025 am 12:02 AM

Die Hijacking der Sitzung kann in den folgenden Schritten erreicht werden: 1. Erhalten Sie die Sitzungs -ID, 2. Verwenden Sie die Sitzungs -ID, 3. Halten Sie die Sitzung aktiv. Zu den Methoden zur Verhinderung der Sitzung der Sitzung in PHP gehören: 1. Verwenden Sie die Funktion Session_regenerate_id (), um die Sitzungs -ID zu regenerieren. 2. Store -Sitzungsdaten über die Datenbank, 3. Stellen Sie sicher, dass alle Sitzungsdaten über HTTPS übertragen werden.

Beschreiben Sie die soliden Prinzipien und wie sie sich für die PHP -Entwicklung anwenden. Beschreiben Sie die soliden Prinzipien und wie sie sich für die PHP -Entwicklung anwenden. Apr 03, 2025 am 12:04 AM

Die Anwendung des soliden Prinzips in der PHP -Entwicklung umfasst: 1. Prinzip der Einzelverantwortung (SRP): Jede Klasse ist nur für eine Funktion verantwortlich. 2. Open and Close Principle (OCP): Änderungen werden eher durch Erweiterung als durch Modifikation erreicht. 3.. Lischs Substitutionsprinzip (LSP): Unterklassen können Basisklassen ersetzen, ohne die Programmgenauigkeit zu beeinträchtigen. 4. Schnittstellen-Isolationsprinzip (ISP): Verwenden Sie feinkörnige Schnittstellen, um Abhängigkeiten und nicht verwendete Methoden zu vermeiden. 5. Abhängigkeitsinversionsprinzip (DIP): Hoch- und niedrige Module beruhen auf der Abstraktion und werden durch Abhängigkeitsinjektion implementiert.

Erklären Sie die späte statische Bindung in PHP (statisch: :). Erklären Sie die späte statische Bindung in PHP (statisch: :). Apr 03, 2025 am 12:04 AM

Statische Bindung (statisch: :) implementiert die späte statische Bindung (LSB) in PHP, sodass das Aufrufen von Klassen in statischen Kontexten anstatt Klassen zu definieren. 1) Der Analyseprozess wird zur Laufzeit durchgeführt.

Was sind REST -API -Designprinzipien? Was sind REST -API -Designprinzipien? Apr 04, 2025 am 12:01 AM

Die RESTAPI -Designprinzipien umfassen Ressourcendefinition, URI -Design, HTTP -Methodenverbrauch, Statuscode -Nutzung, Versionskontrolle und Hassoas. 1. Ressourcen sollten durch Substantive dargestellt und in einer Hierarchie aufrechterhalten werden. 2. HTTP -Methoden sollten ihrer Semantik entsprechen, z. B. Get wird verwendet, um Ressourcen zu erhalten. 3. Der Statuscode sollte korrekt verwendet werden, z. B. 404 bedeutet, dass die Ressource nicht vorhanden ist. 4. Die Versionskontrolle kann über URI oder Header implementiert werden. 5. Hateoas startet Client -Operationen durch Links als Antwort.

Wie können Sie mit Ausnahmen in PHP effektiv umgehen (versuchen Sie, schließlich zu werfen)? Wie können Sie mit Ausnahmen in PHP effektiv umgehen (versuchen Sie, schließlich zu werfen)? Apr 05, 2025 am 12:03 AM

In PHP wird das Ausnahmebehandlung durch den Versuch, Fang, schließlich und werfen Keywords erreicht. 1) Der Try -Block umgibt den Code, der Ausnahmen auslösen kann. 2) Der Catch -Block behandelt Ausnahmen; 3) Block stellt schließlich sicher, dass der Code immer ausgeführt wird. 4) Wurf wird verwendet, um Ausnahmen manuell zu werfen. Diese Mechanismen verbessern die Robustheit und Wartbarkeit Ihres Codes.

Was sind anonyme Klassen in PHP und wann könnten Sie sie verwenden? Was sind anonyme Klassen in PHP und wann könnten Sie sie verwenden? Apr 04, 2025 am 12:02 AM

Die Hauptfunktion anonymer Klassen in PHP besteht darin, einmalige Objekte zu erstellen. 1. Anonyme Klassen ermöglichen es, Klassen ohne Namen direkt im Code zu definieren, was für vorübergehende Anforderungen geeignet ist. 2. Sie können Klassen erben oder Schnittstellen implementieren, um die Flexibilität zu erhöhen. 3. Achten Sie bei der Verwendung auf Leistung und Code -Lesbarkeit und vermeiden Sie es, dieselben anonymen Klassen wiederholt zu definieren.

See all articles