觀察者模式(有時又被稱為發布-訂閱模式)。在此種模式中,一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實現事件處理系統。
UML類圖:
重要角色:
抽象通知者角色(INotifier):定義了通知的接口規則。
具體通知者角色(Boss):實現抽象通知者的接口,接到狀態改變立即向觀察者下發通知。
抽象觀察者角色(IObserver):定義接到通知後所做的操作(Update)接口規則。
具體觀察者角色(JingDong):實現具體操作方法。
核心代碼:
//抽象通知者 abstract class Subject { private $observers = array(); public function Attach(Observer $observer) { array_push($this->observers,$observer); } public function Detach(Observer $observer) { foreach($this->observers as $k=>$v) { if($v==$observer) { unset($this->observers[$k]); } } } function Notify() { foreach($this->observers as $v) { $v->Update(); } } } //具體通知者(Boss和Secretary) class ConcreteSubject extends Subject { public $subject_state; } //抽象觀察者 abstract class Observer { public abstract function Update(); } //具體觀察者 class ConcreteObserver extends Observer { private $name; private $observerState; public $subject; public function __construct(ConcreteSubject $_sub,$_name) { $this->subject = $_sub; $this->name = $_name; } public function Update() { $this->observerState = $this->subject->subject_state; echo 觀察者.$this->name.的新狀態是:.$this->observerState. ; } }
調用客戶端代碼:
header(Content-Type:text/html;charset=utf-8); //-------------------------觀察者模式----------------------- require_once ./Observe/Observe.php; //前台 $_s = new ConcreteSubject(); //寶銀 $baoyin = new ConcreteObserver($_s, 張三); $jiangchao = new ConcreteObserver($_s,李四); //前台記下寶銀姜超 $_s->Attach($baoyin); $_s->Attach($jiangchao); //前台發現老板回來 $_s->subject_state = 孫總回來了; //前台發送通知 $_s->Notify();
優點:
1、一個抽象模型有兩個方面,其中一個方面依賴於另一個方面。將這些方面封裝在獨立的對象中使它們可以各自獨立地改變和復用。
2、一個對象的改變將導致其他一個或多個對象也發生改變,而不知道具體有多少對象將發生改變,可以降低對象之間的耦合度。
3、一個對象必須通知其他對象,而並不知道這些對象是誰。需要在系統中創建一個觸發鏈,A對象的行為將影響B對象,B對象的行為將影響C對象……,可以使用觀察者模式創建一種鏈式觸發機制。