PHP SPL模塊中自帶一個觀察者模式伶氢,觀察者模式是一個非常簡單事件系統(tǒng),包含兩個或者更多交互的類达址,這個模式允許一個類觀察另一個類的狀態(tài)躲因,當被觀察的類發(fā)生變化的時候早敬,這個模式會得到通知。<p>
在觀察者模式中大脉,被觀察的叫subject搁嗓,而負責觀察的類叫做observe,為了表達這些內(nèi)容箱靴,SPL提供了SplSubject和SplObserver接口腺逛。<p>
SplSubject接口;
interface SplSubject{
public function attach(SplObserver $observer);
public funtion detach(SplObserver $observer);
public funtion notify();
}
SplObserver接口衡怀;
interface SplObserver{
public funtion update(SplSubject $subject);
}
這個模式的概念是SplSubject類維護了一個特定狀態(tài)棍矛,當這個狀態(tài)發(fā)生變化時安疗,它就會調(diào)用notify()方法。當調(diào)用notify()方法的時候够委,所有之前的使用的attach()方法注冊的SplObserver實例的update()方法都會被調(diào)用荐类。<p>
代碼:
class demoSubject implement SplSubject{
private $observer,$value;
public function _construct(){
$this->$observer=array();
}
public function attach(SplObserver $observer){
$this->boserver=$observer;
}
public funtion detach($SplObserver $onserver){
if($idx=array_search($observer,$this->$observer,true)){
unset($this->observer[$idx])
}
}
public funtion notify(){
foreach($this->$observers as $observer){
$observer->update($this);
}
}
public funtion setValue($value){
$this->$value=$value;
$this->notify();
}
public funtion getValue(){
return $this->$value;
}
}
demoObserver implements SplObserver{
public funtion update(SplSubject $subject){
echo 'the new value is'.$subject->getValue();
}
}
$subject=new demoSubject();
$observer=new demoObserver();
$subject=attach($observer);
$subject->setValue();//5
觀察者模式的好處是,掛接到訂閱者上的觀察者可多可少茁帽,并不需要提前通知 哪個類會相應subject類發(fā)出事件玉罐。