PHP オブジェクト指向の高度な設計パターン: オブザーバー パターンの使用例

巴扎黑
リリース: 2023-03-07 20:46:01
オリジナル
1583 人が閲覧しました

オブザーバーパターンとは何ですか?

オブザーバー デザイン パターンにより、ターゲット オブジェクトのステータスを表示するオブジェクトの作成が容易になり、コア オブジェクトから分離された指定された機能が提供されます。

パターンは非常に単純です。オブジェクトは、別のオブジェクト (オブザーバー) が自分自身を登録できるようにするメソッドを追加することで、自分自身を監視可能にします。監視可能なオブジェクトが変化すると、登録されたオブザーバーにメッセージが送信されます。これらのオブザーバーは、この情報を使用して、監視可能なオブジェクトとは独立して操作を実行します。その結果、オブジェクトは理由を理解することなく相互に通信できるようになります。


UML

この図は、Observer 設計パターンを使用したクラス設計を詳しく示しています。

PHP オブジェクト指向の高度な設計パターン: オブザーバー パターンの使用例

以下は、上の図の説明です:

1.MyObject は監視可能なオブジェクトです。オブザーバーと呼ばれるオブザーバーで保護された配列が含まれています。パブリック メソッド addObserver() は、オブザーバーのインスタンスを受け取り、それをオブザーバー配列に格納します。

2.doSomething() パブリック メソッドが呼び出され、状態の変更が MyObject に適用されます。続いて、notify() パブリック メソッドが呼び出され、ループ オブザーバー配列を横断できます。

3.MyObjectObserver には、MyObject のインスタンスを受け入れる、change() というパブリック メソッドがあります。この特定のオブザーバーは、MyObject のコンテンツに対して何らかのアクションを実行します。特定のオブザーバーがオブザーバー配列で見つかると、MyObject の Notice() メソッドが直接 change() メソッドを呼び出します。

使用例:

<?php  
interface Observable{  
    function attach( Observer $observer );  
    function detach( Observer $observer );  
    function notify();  
}  
  
  
class login implements Observable{  
    const LOGIN_USER_UNKNOW = 1;  
    const LOGIN_WRONG_PASS = 2;  
    const LOGIN_ACCESS = 3;  
    private $status = array();  
    private $observers = array();  
  
    public function setStatus( $status, $user, $ip ) {  
        $this->status = array( $status, $user, $ip );  
    }  
    public function getStatus() {  
        return $this->status;  
    }  
    public function handleLogin( $user, $pass, $ip ) {  
        switch ( mt_rand( 1, 3 ) ) {  
        case 1:  
            $this->setStatus( self::LOGIN_USER_UNKNOW, $user, $ip );  
            $ret = false;  
            break;  
        case 2:  
            $this->setStatus( self::LOGIN_WRONG_PASS, $user, $ip );  
            $ret = false;  
            break;  
        case 3:  
            $this->setStatus( self::LOGIN_ACCESS, $user, $ip );  
            $ret = true;  
            break;  
        }  
        $this->notify();  
        return $ret;  
    }  
  
  
    public function attach( Observer $observer ) {  
        $this->observers[] = $observer;  
    }  
  
    public function detach( Observer $observer ) {  
        $newObservers = array();  
        foreach ( $this->observers as $obs ) {  
            if ( $obs !== $observer )  
                $newObservers[] = $obs;  
        }  
        $this->observers = $newObservers;  
    }  
  
    public function notify() {  
        foreach ( $this->observers as $obs ) {  
            $obs->update( $this );  
        }  
    }  
}  
  
interface Observer{  
    function update( Observable $observable );  
}  
  
class SecurityMonitor implements Observer{  
    function update( Observable $observable ) {  
        $status = $observable->getStatus();  
        if($status[0] == Login::LOGIN_WRONG_PASS){  
            echo __CLASS__.":".$status[1]."于".$status[2]."登录失败";  
        }  
    }  
}  
  
$login = new Login();  
$login->attach(new SecurityMonitor());  
$login->handleLogin(&#39;XXX&#39;,&#39;XXX&#39;,&#39;127.0.0.1&#39;);  
?>  
出错时的运行结果:  
SecurityMonitor:XXX于127.0.0.1登录失败[Finished in 0.1s]
ログイン後にコピー

このコードでは、ログイン オブジェクトが監視のために SecurityMonitor オブジェクトをアクティブに追加していることがわかります。このように、Login::getStatus() を呼び出すには、SecurityMonitor クラスがさらに多くの情報を知っている必要があります。呼び出しは ObServable オブジェクト上で発生しますが、そのオブジェクトが Login オブジェクトでもあるという保証はありません。この問題を解決するには、ObServable インターフェースを断続的に汎用に保ち、ObServer クラスがその本体が正しいタイプであることを保証する責任を負うという方法があります。自分自身を件名に追加することもできます。

以上がPHP オブジェクト指向の高度な設計パターン: オブザーバー パターンの使用例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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