この記事では主に PHP オブザーバーモードの詳細な説明を紹介します。興味のある方はぜひ参考にしてください。
1. インテント
オブジェクト間の 1 対多の依存関係を定義します。オブジェクトの状態が変化すると、それに依存するすべてのオブジェクトが通知され、自動的に更新されます [GOF95]
これをパブリッシュと呼びます。 -Subscribe(Publish-Subscribe)モード、Model-View(モデルビュー)モード、ソース-リスナー(Source-Listener)モード、またはDependents(依存関係)モード
2. オブザーバーパターン構造図
3. オブザーバー パターンの主な役割 抽象サブジェクト (Subject) ロール: サブジェクト ロールは、オブザーバー オブジェクトへのすべての参照をコレクションに保存します。各サブジェクトは任意の数のオブザーバーを持つことができます。抽象テーマは、オブザーバー オブジェクトを追加および削除するためのインターフェイスを提供します。
抽象オブザーバー (オブザーバー) の役割: すべての特定のオブザーバーのインターフェイスを定義し、観察の対象が変更されたときに自身を更新します。
具体的なサブジェクト (ConcreteSubject) の役割: 特定のオブザーバー オブジェクトへのストレージ関連の状態 特定のサブジェクトの内部状態が変化すると、登録されているすべてのオブザーバーに通知が送信されます。具体的なテーマの役割は、通常、具体的なサブクラスを使用して実装されます。
具象オブザーバー (ConcretedObserver) ロール: 特定のサブジェクト オブジェクトを保存し、関連する状態を保存し、抽象オブザーバー ロールが独自の状態をサブジェクトの状態と一致させるために必要な更新インターフェイスを実装します。
4. オブザーバー パターンの利点と欠点: 1 オブザーバーとサブジェクト間の結合が小さい。 オブザーバー パターンの欠点:
1。オブザーバーは他のオブザーバーの存在を知らないため、ターゲットを変更する最終的なコストがわからない可能性があります。これにより、予期しない更新が発生する可能性があります。
5. オブザーバーパターンの適用可能なシナリオ
1. 抽象モデルに 2 つの側面があり、一方が他方に依存する場合。 2. 1 つのオブジェクトを変更するときに他のオブジェクトも同時に変更する必要がある場合、いくつのオブジェクトを変更する必要があるかはわかりません。
3. オブジェクトが他のオブジェクトに通知する必要がある場合、他のオブジェクトが誰であるかを想定することはできません。言い換えれば、これらのオブジェクトが密結合されることは望ましくありません。 6. オブザーバー パターンとその他のパターン
メディエーター パターン (メディエーター):
複雑な更新セマンティクスをカプセル化することにより、ChangeManager はターゲットとオブザーバーの間のメディエーターとして機能します。 シングルトン モード (シングルトン モード): ChangeManager はシングルトン モードを使用して、一意でグローバルにアクセスできることを保証できます。 7. オブザーバーモードの PHP サンプル
<?php /** * 抽象主题角色 */ interface Subject { /** * 增加一个新的观察者对象 * @param Observer $observer */ public function attach(Observer $observer); /** * 删除一个已注册过的观察者对象 * @param Observer $observer */ public function detach(Observer $observer); /** * 通知所有注册过的观察者对象 */ public function notifyObservers(); } /** * 具体主题角色 */ class ConcreteSubject implements Subject { private $_observers; public function __construct() { $this->_observers = array(); } /** * 增加一个新的观察者对象 * @param Observer $observer */ public function attach(Observer $observer) { return array_push($this->_observers, $observer); } /** * 删除一个已注册过的观察者对象 * @param Observer $observer */ public function detach(Observer $observer) { $index = array_search($observer, $this->_observers); if ($index === FALSE || ! array_key_exists($index, $this->_observers)) { return FALSE; } unset($this->_observers[$index]); return TRUE; } /** * 通知所有注册过的观察者对象 */ public function notifyObservers() { if (!is_array($this->_observers)) { return FALSE; } foreach ($this->_observers as $observer) { $observer->update(); } return TRUE; } } /** * 抽象观察者角色 */ interface Observer { /** * 更新方法 */ public function update(); } class ConcreteObserver implements Observer { /** * 观察者的名称 * @var <type> */ private $_name; public function __construct($name) { $this->_name = $name; } /** * 更新方法 */ public function update() { echo 'Observer', $this->_name, ' has notified.<br />'; } } /** * 客户端 */ class Client { /** * Main program. */ public static function main() { $subject = new ConcreteSubject(); /* 添加第一个观察者 */ $observer1 = new ConcreteObserver('Martin'); $subject->attach($observer1); echo '<br /> The First notify:<br />'; $subject->notifyObservers(); /* 添加第二个观察者 */ $observer2 = new ConcreteObserver('phppan'); $subject->attach($observer2); echo '<br /> The Second notify:<br />'; $subject->notifyObservers(); /* 删除第一个观察者 */ $subject->detach($observer1); echo '<br /> The Third notify:<br />'; $subject->notifyObservers(); } } Client::main(); ?>
以上がPHPオブザーバーパターンの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。