Heim >Backend-Entwicklung >PHP-Tutorial >Das Beobachtermuster verstehen

Das Beobachtermuster verstehen

Jennifer Aniston
Jennifer AnistonOriginal
2025-02-28 09:14:19993Durchsuche

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()

<code class="language-php"><?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));
        }
    }
}</code>

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()

<code class="language-php"><?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;
    }
}</code>

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.

<code class="language-php"><?php
class Auth extends Subject
{
    function login() {
        // 执行登录身份验证的现有代码
        // ...

        // 向任何观察者发出信号,表明用户已登录
        $this->setState("login");
    }

    function logout() {
        // 执行用户注销时执行某些操作的现有代码
        // 例如销毁会话等...

        // 向任何观察者发出信号,表明用户已注销
        $this->setState("logout");
    }
}</code>
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()

<code class="language-php"><?php
class Auth_ForumHook extends Observer
{
    function login($subject) {
        // 调用论坛的 API 函数以登录用户
        // ...
    }

    function logout($subject) {
        // 调用论坛的 API 函数以注销用户
        // ...
    }
}</code>
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.

<code class="language-php"><?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));
        }
    }
}</code>

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!

Stellungnahme:
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