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ßer Artikel

<🎜>: Bubble Gum Simulator Infinity - So erhalten und verwenden Sie Royal Keys
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusionssystem, erklärt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Flüstern des Hexenbaum
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

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)

Heiße Themen

Java-Tutorial
1677
14
PHP-Tutorial
1280
29
C#-Tutorial
1257
24
Erklären Sie sicheres Kennwort -Hashing in PHP (z. B. password_hash, password_verify). Warum nicht MD5 oder SHA1 verwenden? Erklären Sie sicheres Kennwort -Hashing in PHP (z. B. password_hash, password_verify). Warum nicht MD5 oder SHA1 verwenden? Apr 17, 2025 am 12:06 AM

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.

Wie funktioniert der Php -Typ -Hinweis, einschließlich Skalartypen, Rückgabetypen, Gewerkschaftstypen und nullbaren Typen? Wie funktioniert der Php -Typ -Hinweis, einschließlich Skalartypen, Rückgabetypen, Gewerkschaftstypen und nullbaren Typen? Apr 17, 2025 am 12:25 AM

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 und Python: Verschiedene Paradigmen erklärt PHP und Python: Verschiedene Paradigmen erklärt Apr 18, 2025 am 12:26 AM

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.

Wählen Sie zwischen PHP und Python: Ein Leitfaden Wählen Sie zwischen PHP und Python: Ein Leitfaden Apr 18, 2025 am 12:24 AM

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 und Python: Ein tiefes Eintauchen in ihre Geschichte PHP und Python: Ein tiefes Eintauchen in ihre Geschichte Apr 18, 2025 am 12:25 AM

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 und Frameworks: Modernisierung der Sprache PHP und Frameworks: Modernisierung der Sprache Apr 18, 2025 am 12:14 AM

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.

Warum PHP verwenden? Vorteile und Vorteile erläutert Warum PHP verwenden? Vorteile und Vorteile erläutert Apr 16, 2025 am 12:16 AM

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.

Auswirkungen von PHP: Webentwicklung und darüber hinaus Auswirkungen von PHP: Webentwicklung und darüber hinaus Apr 18, 2025 am 12:10 AM

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

See all articles