PHP 觀察者模式

 

觀察者模式:定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,全部依賴於它的對象都獲得通知並被自動更新。php

 

【觀察者模式中主要角色】this

1.抽象主題(Subject)角色: 抽象主題提供了增長,刪除觀察者,通知觀察者對象的接口。
2.抽象觀察者(Observer)角色:爲全部的具體觀察者定義一個接口,在觀察的主題發生改變時更新本身。
3.具體主題(ConcreteSubject)角色:存儲相關狀態到具體觀察者對象,當具體主題的內部狀態改變時,給全部登記過的觀察者發出通知。具體主題角色是抽象主題(Subject)角色實現。
4.具體觀察者(ConcretedObserver)角色:實現抽象觀察者角色(Observer)所要求的更新接口。.net

主題也能夠理解爲被觀察者,就像賭場的每一個場子同樣,而觀察者就是每一個場子裏的賭徒,當每一個場子的荷官搖完骰子,賭徒們都會有一系列的動做。server

【觀察者模式PHP示例】對象

 

interface Subject{                       # 賭場的環境能幹什麼
    public function attach($observer);  # 來賭徒
    public function detach($observer);  # 賭徒走了
    public function doIt();              # 開盤了
}

class ConcreteSubject implements  Subject {   # 賭場的一個桌子
    public $obj = [];

    public function attach($observer){
        if(!in_array($observer,$this->obj)){
            $this->obj[] = $observer;
        }
    }

    public function detach($observer){
        $key = array_search($observer,$this->obj);
        if($key){
            unset($this->obj[$key]);
        }
    }

    public function doIt(){
        if(!empty($this->obj)){
            foreach ($this->obj as $v){
                $v->go();
            }
        }
    }
}


interface Observer{    # 賭場的人能幹什麼
    public function go();
}


class ConcreteObserver1 implements Observer {  # 賭徒1

    public function go(){
        echo "我壓大";
    }
}


class ConcreteObserver2 implements Observer {  # 賭徒2

    public function go(){
        echo "我壓小";
    }
}

$subject = new ConcreteSubject();
$observer1 = new ConcreteObserver1();
$observer2 = new ConcreteObserver2();
$subject->attach($observer1);   # 賭徒1過來了
$subject->attach($observer2);   # 賭徒2過來了
$subject->doIt();   # 開盤了
相關文章
相關標籤/搜索