熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PHP編程 >> 正文

php設計模式之觀察者模式的應用詳解

2013-11-15 12:36:15  來源: PHP編程 

  觀察者模式定義對象間一種一對多的依賴關系當一個對象的狀態發生改變時所有依賴於它的對象都得到通知並自動更新
觀察者類
抽象主題角色主題角色將所有對觀察者對象的引用保存在一個集合中每個主題可以任意多個觀察者抽象主題提供了增加和刪除觀察者對象的接口
抽象觀察者角色為所有的具體觀察者定義一個接口在觀察的主題發生改變時更新自己
具體主題角色存儲相關狀態到具體觀察者對象當具體主題的內部狀態發生改變時給所有登記過的觀察者發出通知具體主題角色通常用一個具體子類實現
具體觀察者角色存儲一個具體主題對象存儲相關狀態實現抽象觀察者角色所要求的更新接口以使得其自身狀態和主題的狀態保持一致
作用
觀察者模式的耦合度較小
支持廣播通信

 代碼如下:
<?php
//抽象主題
interface Subject{
public function attach($observer);
public function detach($observer);
public function notifyObservers();
}
//具體主題
class ConcreateSubject implements Subject{
private $_observers;
public function __construct(){
$this>_observers = array();
}

public function attach($observer){
return array_push($this>_observers$observer);
}

public function detach($observer){
$index = array_search($observer$this>_observers);
if($index === false || !array_key_exists($index$this>_observers)){
return false;
}
unset($this>_observer[$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 implement Observer{
private $_name;
public function __construct($name){
$this>_name = $name;
}

public function update(){
echo Observer$this>_namehas notified<br/>;
}
}

//客戶端
class Client{
public static function main(){
$subject = new ConcreteSubject();
//新增第一個觀察者
$observer = new ConcreteObserver(Martin);
$subject>attach($observer);
//通知
$subject>notifyObservers();

//新增第二個觀察者
$observer = new ConcreteObserver(jaky);
$subject>attach($observer);
//通知
$subject>notifyObservers();

//刪除觀察者
$subject>deatch($observer);
//通知
$subject>notifyObservers();
}
}

Client::main();
?>
From:http://tw.wingwit.com/Article/program/PHP/201311/21261.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.