觀察者模式:定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,全部依賴於它的對象都獲得通知並被自動更新。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(); # 開盤了