假設項目經理讓咱們寫了一個登錄接口,咔咔擦擦寫完了php
咱們須要讓項目保持高內聚低耦合,就能夠用到觀察者模式(也不是非要,看需求)數組
觀察者,觀察者,首先要有個被人觀察的角色,這是惟一的,而後會有無數個觀察者去看她,能夠說是一羣人在圍觀一我的,既然有無數個觀衆,那總得有個東西記錄有哪些觀察者,那就應該有一個相似於數組同樣來儲存全部觀察者,總結就是一個被觀察者,無數個觀察者,再有一個容器記錄函數
// 主題接口 interface Subject{ public function register(Observer $observer); public function notify(); } // 觀察者接口 interface Observer{ public function watch(); }
Subject就是被觀察者,Observer就是觀衆,也就是觀察者this
// 被觀察者 class Action implements Subject{ public $_observers=array(); public function register(Observer $observer){ $this->_observers[]=$observer; } public function notify(){ foreach ($this->_observers as $observer) { $observer->watch(); } } }
Action實現了被觀察者接口,他如今就是被觀察者,再定義一個$_observers數組,他就是記錄觀衆的容器了。
首先實現register方法,用它傳入一個觀察者,而後塞到數組裏,再實現notify()方法,它會遍歷容器數組,執行每一個觀察者的watch()方法。指針
// 觀察者 class Cat implements Observer{ public function watch(){ echo "Cat watches TV<hr/>"; } } class Dog implements Observer{ public function watch(){ echo "Dog watches TV<hr/>"; } } class People implements Observer{ public function watch(){ echo "People watches TV<hr/>"; } }
這裏定義了三個觀察者,全都實現了Observer接口,前面的Subject會循環調用每一個觀察者的watch()方法,因此咱們須要實現每一個觀察者的watch()方法。
#### 調用code
// 應用實例 $action=new Action(); $action->register(new Cat()); $action->register(new People()); $action->register(new Dog()); $action->notify();
首先new被觀察者對象,執行它的register()方法,把每一個觀察者都放入容器數組,最後執行notify()方法,通知全部觀察者執行本身的方法。server
PHP有自帶的觀察者模式對象
首先咱們有一個用戶登陸類接口
class user{ public function login() { echo '登陸完畢' }
讓他實現splsubject接口成爲被觀察者。事件
class user implements splsubject{ protected $observer = null; public function __construct() { $this->observer = new SplObjectStorage(); } public function login() { $this->notify(); echo '登陸完畢'; } public function attach(SplObserver $observer) { $this->observer->attach($observer); } public function detach(SplObserver $observer) { $this->observer->detach($observer); } public function notify() { $this->observer->rewind(); while ($this->observer->valid()) { $observer = $this->observer->current(); $observer->update($this); $this->observer->next(); } } }
每一個觀察者實現SplObserver接口,並實現update()方法
class cat implements SplObserver { public function update(SplSubject $subject) { echo '小貓叫一下'; } } class dog implements SplObserver { public function update(SplSubject $subject) { echo '小狗吼一聲'; } }
// 實時觀察 $user = new user(); $user->attach(new cat()); $user->attach(new dog()); $user->login();