まず、Observer パターンの概念を理解してください。オブジェクトは、別のオブジェクト (オブザーバー) が自身を登録できるようにするメソッドを追加することで、自身を監視可能にします。監視可能なオブジェクトが変化すると、登録されたオブザーバーにメッセージが送信されます。これらのオブザーバーは、この情報を使用して、監視可能なオブジェクトとは独立して操作を実行します。その結果、オブジェクトは理由を理解することなく相互に通信できるようになります。オブザーバー パターンはイベント システムです。つまり、このパターンにより、クラスが別のクラスの状態を監視できるようになり、監視しているクラスは通知を受け取り、対応するアクションを実行できます。コンポーネント間の密結合を回避する機能を備えています。
UML 構造図:
オブザーバー パターンによって解決される問題
私たちの開発プロセスでは、コードの一部を変更すると、明らかに必要な他の変更が生じるという問題に遭遇したはずです。この状況を完全に回避することは可能性が低いですが、他のコンポーネントへの依存関係をできるだけ減らすように努める必要があり、オブザーバー パターンはこの問題を解決するように設計されています。
たとえば、次のコードを持つ投稿オブジェクトがあります:
class Post { protected $_userid = null; protected $_ip = null; protected $_content = null; function __construct() { // ... } // 发帖方法 public function addPost() { // ... 发帖逻辑 } }
上記は通常の投稿オブジェクトです。投稿数と訪問数が増えると、オペレーターは頻繁に苦情の電話を受け始めます。私たちのウェブサイトには機密性の高いコンテンツとスパム広告が多数含まれているため、コンテンツの審査を行う必要があると述べています。まず、ユーザーの審査、ブラックリストに登録された一部のユーザーの投稿を禁止する必要があります。3 番目は、コンテンツの審査です。・センシティブな言葉。したがって、私たちのコードは次のようになります:
class Post { protected $_userid = null; protected $_ip = null; protected $_content = null; function __construct() { } public function addPost() { if (!Postscan::checkUserid($tihs->_userid)) { return false; } if (!Postscan::ipUserid($tihs->_ip)) { return false; } if (!Postscan::checkContent($tihs->_content)) { return false; } // ... } }
レビューする必要があるフィールドが増えるにつれて、addPost メソッドはますます長くなり、公開オブジェクトはシステムの中央にしっかりと埋め込むことしかできなくなります。
オブザーバーパターンの実装
オブザーバーパターンの核心は、イベントが発生したことをサブジェクトが知っているときに、同時にオブザーバーに通知する必要がないことです。サブジェクトとオブザーバーの関係はハードコーディングされているため、上記のコードを変更しましょう:
//主体必须实现的接口 interface Observable { public function attach(Observer $observer); public function detach(Observer $observer); public function notify(); } //观察者必须实现的接口 interface Observer { public function do(Observable $subject); } class Post implements Observable { protected $_userid = null; protected $_ip = null; protected $_content = null; protected $_observerlist = array(); function __construct() { } public function attach(Observer $observer) { $this->_observerlist[] = $observer; } public function detach(Observer $observer) { foreach ($this->_observerlist as $key => $value) { if ($observer === $value) { unset($this->_observerlist[$key]) } } } public function notify() { foreach ($this->_observerlist as $value) { if (!$value->do($this)) { return false; } } return true; } public function addPost() { if (!$this->notify()) { return false; } // ... } }
上記のコードを使用すると、監査ルールを簡単に追加できます。
SPL コード
オブザーバー パターンは非常に一般的で一般的に使用されるデザイン パターンであるため、SPL 拡張機能によって対応するクラスとメソッドがカプセル化されています。次のコードは、SPL によって提供される 3 つの要素に基づいています。 、SplSubject、SplObjectStorage
class Post implements SplSubject { protected $_userid = null; protected $_ip = null; protected $_content = null; protected $_storage = new SplObjectStorage(); function __construct() { } public function attach(SplObject $observer) { $this->_storage->attach($observer); } public function detach(SplObject $observer) { $this->_storage->detach($observer); } public function notify() { foreach ($this->_storage as $value) { if (!$value->update($this)) { return false; } } return true; } public function addPost() { if (!$this->notify()) { return false; } // ... } }
によって実装されたコードは非常にシンプルです。最も重要なことは、この例ではいくつかの監査メソッドを post クラスから分離しており、post オブジェクトは Other としても使用できることを理解することです。出版タイプ。
上記の内容の実装は、編集者が皆さんに紹介したPHPデザインパターンのオブザーバーモードです。
上記は、PHP デザイン パターンのオブザーバー パターンの例を、関連する内容も含めて紹介しました。PHP チュートリアルに興味のある友人の参考になれば幸いです。