【意図】
オブジェクト間の 1 対多の依存関係を定義します。オブジェクトのステータスが変化すると、それに依存するすべてのオブジェクトが通知され、自動的に更新されます [GOF95]。パブリッシュ-サブスクライブ (パブリッシュ-サブスクライブ) パターン、モデルとも呼ばれます。 -View(Model-View)パターン、Source-Listener(Source-Listener)パターン、またはDependents(依存関係)パターン
【オブザーバーパターン構造図】
【観察者モードの主役】
1. 抽象サブジェクト (Subject) ロール: サブジェクト ロールは、オブザーバー オブジェクトへのすべての参照をコレクションに保存し、各サブジェクトは好きなだけオブザーバーを持つことができます。 抽象テーマは、オブザーバー オブジェクトを追加および削除するためのインターフェイスを提供します。
2. 抽象オブザーバー (オブザーバー) の役割: すべての特定のオブザーバーのインターフェイスを定義し、観察の対象が変更されたときに自身を更新します。
3. 具象サブジェクト (ConcreteSubject) ロール: 特定のオブザーバー オブジェクトに関連する状態を保存し、特定のサブジェクトの内部状態が変化すると、登録されているすべてのオブザーバーに通知が送信されます。具体的なテーマの役割は、通常、具体的なサブクラスを使用して実装されます。
4. 具象オブザーバー ロール: 特定のサブジェクト オブジェクトを保存し、関連する状態を保存し、抽象オブザーバー ロールが自身の状態をサブジェクトの状態と一致させるために必要な更新インターフェイスを実装します。
【オブザーバーモードのメリットとデメリット】
オブザーバー パターンの利点:
1. 観察者と被験者の間の結合は小さいです
2.
オブザーバーは他のオブザーバーの存在を認識していないため、ターゲットを変更するための最終的なコストがわからない可能性があります。これにより、予期しない更新が発生する可能性があります。
【オブザーバーモードの適用シナリオ】
1 つのオブジェクトを変更するために他のオブジェクトも同時に変更する必要がある場合、変更する必要があるオブジェクトの数がわかりません。
オブジェクトが他のオブジェクトに通知する必要がある場合、他のオブジェクトが誰であるかを想定することはできません。言い換えれば、これらのオブジェクトを密結合にする必要はありません。
【オブザーバーモードとその他のモード】
1. メディエーター パターン (メディエーター): 複雑な更新セマンティクスをカプセル化することで、ChangeManager はターゲットとオブザーバーの間のメディエーターとして機能します。2. シングルトン モード (シングルトン モード): ChangeManager はシングルトン モードを使用して、一意でグローバルにアクセスできるようにすることができます。
【オブザーバーモードのPHPサンプル】
/**
* 观察者模式
* @package design pattern
*/
/**
* 抽象主题角色
*/
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
*/
private $_name;
public function __construct($name) {
$this->_name = $name;
}
/**
* 更新方法
*/
public function update() {
echo 'Observer', $this->_name, ' has notified.
';
}
}
实例化类:
$subject = new ConcreteSubject();
/* 添加第一个观察者 */
$observer1 = new ConcreteObserver('Martin');
$subject->attach($observer1);
echo '
The First notify:
';
$subject->notifyObservers();
/* 添加第二个观察者 */
$observer2 = new ConcreteObserver('phppan');
$subject->attach($observer2);
echo '
The Second notify:
';
$subject->notifyObservers();
/* 删除第一个观察者 */
$subject->detach($observer1);
echo '
The Third notify:
';
$subject->notifyObservers();
具体案例:
/**
* 3.1php设计模式-观测者模式
* 3.1.1概念:其实观察者模式这是一种较为容易去理解的一种模式吧,它是一种事件系统,意味
* 着这一模式允许某个类观察另一个类的状态,当被观察的类状态发生改变的时候,
* 观察类可以收到通知并且做出相应的动作;观察者模式为您提供了避免组件之间
* 紧密耦合的另一种方法
* 3.1.2关键点:
* 1.被观察者->追加观察者;->一处观察者;->满足条件时通知观察者;->观察条件
* 2.观察者 ->接受观察方法
* 3.1.3缺点:
* 3.1.4观察者模式在PHP中的应用场合:在web开发中观察者应用的方面很多
* 典型的:用户注册(验证邮件,用户信息激活),购物网站下单时邮件/短信通知等
* 3.1.5php内部的支持
* SplSubject 接口,它代表着被观察的对象,
* 其结构:
* interface SplSubject
* {
* public function attach(SplObserver $observer);
* public function detach(SplObserver $observer);
* public function notify();
* }
* SplObserver 接口,它代表着充当观察者的对象,
* 其结构:
* interface SplObserver
* {
* public function update(SplSubject $subject);
* }
*/
/**
* 用户登陆-诠释观察者模式
*/
class User implements SplSubject {
//注册观察者
public $observers = array();
//动作类型
CONST OBSERVER_TYPE_REGISTER = 1;//注册
CONST OBSERVER_TYPE_EDIT = 2;//编辑
/**
* 追加观察者
* @param SplObserver $observer 观察者
* @param int $type 观察类型
*/
public function attach(SplObserver $observer, $type)
{
$this->observers[$type][] = $observer;
}
/**
* 去除观察者
* @param SplObserver $observer 观察者
* @param int $type 观察类型
*/
public function detach(SplObserver $observer, $type)
{
if($idx = array_search($observer, $this->observers[$type], true))
{
unset($this->observers[$type][$idx]);
}
}
/**
* 满足条件时通知观察者
* @param int $type 观察类型
*/
public function notify($type)
{
if(!empty($this->observers[$type]))
{
foreach($this->observers[$type] as $observer)
{
$observer->update($this);
}
}
}
/**
*/
パブリック関数 addUser()
{
//SQLを実行する
成功 // データベースは正常に挿入されました $ res = true
;
$ this->
$res を返します。
/** * ユーザー情報の編集
* @param str $username ユーザー名
* @param str $email メールアドレス
*/
{
使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用するto's to' through'''''' through''‐‐ to‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐
$これ -
$res;
$res を返します。
/**
* オブザーバーがメールを送信
*/
class Send_Mail は SplObserver を実装します
/**
* 対応する観測天体の情報変更 * @param SplSubject $subject
*/
{
$this->sendMail($subject->email) 、$title、$content);
/**
*メールを送信
*@param str $email メールアドレス
*@param str $content メールの内容
* /
public function sendemail ($ email, $ table, $ content) {
// メールインターフェイスを呼び出し、メールを送信します}}} & Gt;
http://www.bkjia.com/PHPjc/750852.html
www.bkjia.com
true
技術記事
[目的] オブジェクト間の 1 対多の依存関係を定義します。オブジェクトの状態が変化すると、それに依存するすべてのオブジェクトが通知され、自動的に更新されます。[GOF95] 別名...