PHPデザインパターンの詳細説明 オブザーバーパターン

巴扎黑
リリース: 2023-03-15 10:36:02
オリジナル
1413 人が閲覧しました


要約: Yii2 イベントは「オブザーバー モード」を採用しています。最初にオブザーバーを理解してからイベントを学習するのが簡単です。

それは何ですか

まず、名前に怖がらないでください、下を向いてください、それは本当に簡単です。

より高度な定義から始めましょう。オブザーバー パターンは、一連のオブジェクト間の 1 対多の関係を定義します。オブジェクトの状態が変化すると、他の依存関係が通知を受け取ります。

分かりますか?

理解できない場合は、より現実的なものを考えてみましょう。オブザーバー モデルは、新聞を注文するモデルです。新しい新聞が発行される限り、新聞は特定の新聞に注文します。あなたに届けてください。それは新聞とは何の関係もありません。新聞が閉店しない限り、あなたに届けられ続けます。

もちろん、登録を解除することもできます。

オブザーバー パターン == 新聞 + 新聞を注文する人

どの定義を理解していても、1 つ覚えておいてください、「オブザーバー パターン」の最も素晴らしい点は、相互に依存するいくつかのクラスを緩やかに結合していることです。強制システムはこんな感じですか?つまり、各オブジェクト間の依存度は氷点まで低下しますが、相互作用は依然として可能です。

コーディングしてみよう

この時点で、オブザーバー パターンについてはすでに理解できたと思いますが、言語記事としては、コードを記述せずに正当化することはできません。上記の要件を達成するためにコードを使用してみましょう。

オブザーバー パターンを使用しないコードから始めましょう

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

実際、システムが小さい場合、これは非常に高速で効果的な方法です。

しかし、システムが大きくなると、この方法はすぐにスケーラビリティが難しく、エラーが発生しやすいという問題に直面します。

  • たとえば、Lao Wang が購読したくない場合は、ソースコードを変更する必要があります。

  • たとえば、別の顧客が追加された場合、ソースコードを変更する必要があります。

  • たとえば、xxx、私たちは皆、ソースコードを変更する必要があります。

これら 2 つのオブジェクト間の結合が高すぎます。

解決 - オブザーバーパターンを使用してください

まず上記のコードを改善しましょう

/**
 * 被观察者接口
 * 定义了一些公用方法声明,使用观察者模式的类都可以继承此接口
 */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();
        }
    }
}
ログイン後にコピー

ご覧のとおり、変更されたコードは送信先を気にせず、すべてのオブザーバーのリストを調べて通知するだけですそれについては、それだけです。オブザーバーの増減は、このタイプには影響しません。

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

/**
 * 观察者接口
 */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类和其他的观察者类,将类之间的耦合降低了很多。

回头看

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

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

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

以上がPHPデザインパターンの詳細説明 オブザーバーパターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート