程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php設計模式之觀察者模式的應用詳解

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

編輯:關於PHP編程

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

     代碼如下:
    <?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->_name.'has notified<br/>';
    }
    }

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

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

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

    Client::main();
    ?>
    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved