Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung des PHP-Entwurfsmusters Observer-Muster

Detaillierte Erläuterung des PHP-Entwurfsmusters Observer-Muster

巴扎黑
巴扎黑Original
2017-08-17 09:05:131363Durchsuche


Zusammenfassung: Yii2-Ereignisse übernehmen den „Beobachtermodus“. Es ist einfacher, zuerst den Beobachter zu verstehen und dann die Ereignisse zu lernen.

Was ist das?

Lassen Sie sich zunächst nicht vom Namen einschüchtern, lesen Sie weiter, es ist wirklich einfach.

Beginnen wir mit einer übergeordneten Definition: Das Beobachtermuster definiert eine Eins-zu-Viele-Beziehung zwischen einer Reihe von Objekten. Wenn ein Objekt seinen Status ändert, erhalten andere abhängige Objekte Benachrichtigungen.

Verstehst du?

Wenn Sie das nicht verstehen, geben wir Ihnen eine realistischere Vorstellung: Das Beobachtermodell ist das Modell, bei dem Sie und einige Leute Zeitungen bei einer bestimmten Zeitung bestellen , die Zeitung wird es Ihnen zusenden. Was Sie konkret denken, hat nichts mit der Zeitung zu tun. Solange die Zeitung nicht schließt, wird sie Ihnen weiterhin zugestellt.

Selbstverständlich können Sie sich auch abmelden.

Beobachtermodus == Zeitung + Zeitungsabonnent

Egal welche Definition Sie verstehen, denken Sie an eines: Der „Beobachtermodus“ ist der großartigste Ort, den es gibt Einige voneinander abhängige Klassen lose koppeln. Wie sieht ein großartiges System aus? Das heißt, der Grad der Abhängigkeit zwischen den einzelnen Objekten wird auf einen Gefrierpunkt reduziert, eine Interaktion ist jedoch weiterhin möglich.

Codieren Sie es

Ich denke, zu diesem Zeitpunkt kennen Sie das Beobachtermuster bereits, aber als Sprachartikel macht es keinen Sinn, ohne Code zu schreiben, um die oben genannten Anforderungen zu realisieren.

Beginnen wir mit einem Code, der nicht das Beobachtermuster verwendet

class Video {    public function new(){
        $checkNewVideo = Video::find()->where("xxxxx")->one();        if($checkNewVideo){            //    通知各位
            LaoWang::newVideo();
            XiaoLi::newVideo();
            ChuanPu::newVideo();
            .......            //    还有很多很多,比如在给某个集体客户群发、短信发等等等等
        }
    }
}//    具体实现$model = new Video();
$model->new();

Wenn das System klein ist, ist dies tatsächlich eine sehr schnelle und effektive Methode.

Wenn das System jedoch größer wird, steht diese Methode sofort vor dem Problem, schwierig erweiterbar und fehleranfällig zu sein.

  • Wenn Lao Wang sich beispielsweise nicht anmelden möchte, müssen wir den Quellcode ändern.

  • Wenn beispielsweise ein weiterer Kunde hinzugefügt wird, müssen wir den Quellcode ändern.

  • Zum Beispiel xxx müssen wir alle den Quellcode ändern.

Die Kopplung zwischen diesen beiden Objekten ist zu hoch.

Lösen Sie es – verwenden Sie das Beobachtermuster

Lass uns zuerst den obigen Code verbessern

/**
 * 被观察者接口
 * 定义了一些公用方法声明,使用观察者模式的类都可以继承此接口
 */interface Observable {    // 添加/注册观察者
    public function attach(Observer $observer);    // 删除观察者
    public function detach(Observer $observer);    // 触发通知
    public function notify();
}class Video implements Observable {    public $observers = [];//    订阅者

    //    添加观察者
    public function attach(Observer $observer){
        $key = array_search($observer, $this->observers);        if ($key === false) {            $this->observers[] = $observer;
        }
    }    //    删除观察者
    public function detach(Observer $observer){
        $key = array_search($observer, $this->observers);        if ($key !== false) {            unset($this->observers[$key]);
        }
    }    //    通知所有观察者
    public function notify(){        foreach ($this->observers as $observer) {            // 把本类对象传给观察者
            $observer->update($this);
        }
    }    public function  new(){
        $checkNewVideo = Video::find()->where("xxxxx")->one();        if($checkNewVideo){            $this->notify();
        }
    }
}

Wie Sie sehen können, ist es dem geänderten Code egal, an wen er gesendet wird. Es geht lediglich die Liste aller Beobachter durch und teilt ihnen mit, dass das Hinzufügen und Entfernen von Beobachtern keine Auswirkungen auf diesen Typ hat.

对于观察者,数字不定,随时有增减,因此我们定义了一个观察者接口开始抽象它们。

/**
 * 观察者接口
 */interface Observer{    // 接收到通知的处理方法
    public function update(Observable $observable);
}

老王、小明、川普、冰冰订阅了视频

class LaoWang implements Observer {    public function update(Observable $observable){        echo "立刻开始看视频";
    }
}class XiaoMing implements Observer {    public function update(Observable $observable){        echo "收到后忽略通知";
    }
}class ChuanPu implements Observer {    public function update(Observable $observable){        echo "收藏了一下,然后去wc看";
    }
}class BingBing implements Observer {    public function update(Observable $observable){        echo "立刻开始看视频";
    }
}

具体实现

$model = new Video();
$model->attach(new LaoWang());
$model->attach(new XiaoLi());
$model->attach(new ChuanPu());
$model->attach(new BingBing());
$model->new();

这样当我们再增加一个人加入 习大大 的时候,我们只需要增加一个习大大的观察者类,在实现的时候添加注册,而不需要去改Video类和其他的观察者类,将类之间的耦合降低了很多。

回头看

上面就是观察者模式,我们先预想一下我们的事件,假设我们定义了很多观察者代码,他们监听事件的发生,当一个事件被触发,这些观察者都会知道,执行各自的逻辑。

事件就是观察者模式的一种应用。

监听系统的某一个行为,实时获取并执行自己负责的代码。

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des PHP-Entwurfsmusters Observer-Muster. 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