ホームページ  >  記事  >  バックエンド開発  >  PHP におけるオブザーバー パターンの詳細な分析

PHP におけるオブザーバー パターンの詳細な分析

青灯夜游
青灯夜游転載
2021-06-30 19:43:243187ブラウズ

前の記事「PHP のアダプター パターンを理解する」では、PHP のアダプター パターンについて紹介しましたが、この記事では、PHP のオブザーバー パターンについて説明します。

PHP におけるオブザーバー パターンの詳細な分析

#観察者、このキャラクターは多くの SF 作品に登場するようです。たとえば、私のお気に入りのアメリカのテレビ シリーズの 1 つである「フリンジ」では、観察者が常に時間と空間を移動して、さまざまな人物や物体を記録します。ただし、デザインパターンにおける観察者はただ傍観しているのではなく、対象の状態変化に応じて対応する行動をとります。

Gof クラス図と説明

GoF 定義: オブジェクト間の 1 対多の依存関係を定義します。変更が発生すると、それに依存するすべてのオブジェクトが通知され、自動的に更新されます。

#GoF クラス図:

PHP におけるオブザーバー パターンの詳細な分析

#コードの実装

interface Observer
{
    public function update(Subject $subject): void;
}

オブザーバーの抽象インターフェイスについては特に言うことはありません。特定の Update

class ConcreteObserver implements Observer
{
    private $observerState = '';
    function update(Subject $subject): void
    {
        $this->observerState = $subject->getState();
        echo '执行观察者操作!当前状态:' . $this->observerState;
    }
}

を実装できるだけです。特定のオブザーバーupdate() メソッドを実装します。ここで、Subject クラスを取得します。これにより、ステータスを取得できます。

class Subject
{
    private $observers = [];
    private $stateNow = '';
    public function attach(Observer $observer): void
    {
        array_push($this->observers, $observer);
    }
    public function detach(Observer $observer): void
    {
        $position = 0;
        foreach ($this->observers as $ob) {
            if ($ob == $observer) {
                array_splice($this->observers, ($position), 1);
            }
            ++$position;
        }
    }
    public function notify(): void
    {
        foreach ($this->observers as $ob) {
            $ob->update($this);
        }
    }
}

Subject 親クラスは、オブザーバー配列を維持し、これを追加、削除、ループします。配列メソッドのメソッドは、すべてのオブザーバーを簡単に管理するためのものです。

class ConcreteSubject extends Subject{
    public function setState($state)
    {
        $this->stateNow = $state;
        $this->notify();
    }

    public function getState()
    {
        return $this->stateNow;
    }
}

Subject の実装クラスはステータスを更新するだけです。ステータスが変化すると、オブザーバー トラバーサル メソッドが呼び出され、すべてのオブザーバーが更新されます。()Operation

    オブザーバーは実際にそれ自体を更新し、サブジェクトはオブザーバーをバッチで実行できます。ターゲット クラス内のコードを変更する必要がないことに注意してください。外部から追加するだけで済みます。ターゲットとオブザーバーは分離されており、お互いの状況を気にする必要はありません。
  • オブザーバーはターゲットのステータスを記録できますが、記録する必要はありません。たとえば、完了後に次のメッセージを送信します。データベースの更新や SMS の挿入操作では、SMS インターフェイスの送信が成功した後でのみ SMS データのステータスを変更できます。ターゲットの送信ステータスをオブザーバーに送信する必要は必ずしもありません。
  • When aクラスは in です。変更が発生すると、他のクラスがどれだけ影響を受けるかわかりません。現時点では、オブザーバーは非常に役立ちます。オブザーバー パターンにはまだ結合があります。つまり、オブザーバー オブジェクトのリストがユーザーが update() メソッドを実装していない場合、問題が発生します。私たちは模倣電話の束に狙われました (観察)、私が提供した機能 (ステータス更新) が何であれ、彼らは同じ機能 (更新) を提供し、さらに私に基づいてさらに多くのことを実行します。これは婉曲的に「マイクロイノベーション」と呼ばれています。 !イライラするとかしないとか。そうですね、私も市場調査員(オブザーバー)のグループを派遣して、他の人の携帯電話がどのような機能を持っているか(ステータスアップデート)を観察するのを手伝ってもらいました。そして、私たちはそれらをコピーしていくつかのマイクロイノベーションを起こし、皆で一緒に進歩できるようにします. ! !
  • #完全なコード: https://github.com/zhangyue0503/designpatterns-php/blob/master/06.observer/source/observer.php

##例

今回は注文から始めますが、テキスト メッセージの送信がまだ残っています。一般的な電子商取引プラットフォームで誰かが注文すると、在庫を変更したり、テキスト メッセージやプッシュ通知を送信して販売者に誰かが注文したことを伝えたり、購入者にその旨を伝えたりするなど、多くの作業を行う必要があります。注文は正常に行われ、支払いも正常に完了しました。つまり、一つの出来事が起こると、様々な出来事が起こるのです。実際、これは、別の非常に有名なモデル
Subscribe および Publishing

モデルにつながります。このモードはオブザーバーのアップグレード モードと言えます。この一連の記事では詳細には触れませんが、

パブリッシュとサブスクライブ
および

イベント モニタリング の側面を確認することができます。ララベルで。

受注販売クラスの図

完全なソース コード: https://github.com/zhangyue0503/designpatterns- php/blob/master/06.observer/source/order-observer.php

interface Observer
{
    public function update($obj);
}

class Message implements Observer
{
    //....

    function update($obj)
    {
        echo '发送新订单短信(' . $obj->mobile . ')通知给商家!';
    }

    //....
}

class Goods implements Observer
{
    //....

    public function update($obj)
    {
        echo '修改商品' . $obj->goodsId . '的库存!';
    }

    //....
}

class Order
{
    private $observers = [];
    public function attach($ob)
    {
        $this->observers[] = $ob;
    }

    public function detach($ob)
    {
        $position = 0;
        foreach ($this->observers as $ob) {
            if ($ob == $observer) {
                array_splice($this->observers, ($position), 1);
            }
            ++$position;
        }
    }
    public function notify($obj)
    {
        foreach ($this->observers as $ob) {
            $ob->update($obj);
        }
    }
    public function sale()
    {
        // 商品卖掉了
        // ....
        $obj = new stdClass();
        $obj->mobile = '13888888888';
        $obj->goodsId = 'Order11111111';
        $this->notify($obj);
    }
}

$message = new Message();
$goods = new Goods();
$order = new Order();
$order->attach($message);
$order->attach($goods);

// 订单卖出了!!
$order->sale();

説明

PHP におけるオブザーバー パターンの詳細な分析

  • 私たちは GoF クラス図に完全に準拠していません。GoF は聖書ですが、必ずしも完全に準拠しなければならないという意味ではありません。特定のビジネス状況に合わせて適切に調整し、
  • を使用できます。
  • 注文 sale()メソッドでステータスが変化した後、直接notifyメソッドを呼び出してオブザーバーを呼び出します
  • テキストメッセージの送信とプッシュ通知の送信はオブザーバーで1つずつ分離して実装することができます。オブザーバーは必ずしもこの A メソッドだけを持っているわけではなく、共通のインターフェイスを実装するだけで済みます。
  • 製品インベントリとメッセージ送信は実際にはまったく関連のない 2 つのクラスですが、同じインターフェイスを実装するだけで済みます
  • PHP の SPL 拡張機能は、オブザーバー インターフェイスのセットを用意しました。試してみることができます。ネイティブにサポートされているオブザーバー モードを使用すると、多くのトラブルを回避できます。

SPL 拡張機能はオブザーバー パターンを実装します - 完全なソース コード: https://github.com/zhangyue0503/designpatterns-php/blob/master/06.observer/source/spl_observer.php

この記事は、https://juejin.cn/post/6844903930262978574

著者: ハードコア プロジェクト マネージャー

推奨学習から転載されました。 : "PHP ビデオ チュートリアル "

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

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。