时间:2021-07-01 10:21:17 帮助过:5人阅读
- <br><?php <br>/** <br>* 观察者模式 <br>* <br>* 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新 <br>* 能够便利地创建查看目标对象状态的对象,并且提供与核心对象非耦合的指定功能 <br>* 插件系统 <br>*/ <br>class Observerable <br>{ <br>private $_observers = array(); <br><br>public function registerObserver($observer) <br>{ <br>$this->_observers[] = $observer; <br>} <br><br>public function removeObserver($observer) <br>{ <br>$key = array_search($observer,$this->_observers); <br>if(!($key === false)) <br>{ <br>unset($this->_observers[$key]); <br>} <br>} <br><br>public function notifyObservers() <br>{ <br>foreach($this->_observers as $observer) <br>{ <br>if($observer instanceof Observer) $observer->update($this); <br>} <br>} <br>} <br><br>interface Observer <br>{ <br>public function update($observer); <br>} <br><br>interface DisplayElement <br>{ <br>public function display(); <br>} <br><br>// -- 实例类定义 <br>class NewsObserverable extends Observerable <br>{ <br>private $_sports_news; <br>public function setSportsNews($data) <br>{ <br>$this->_sports_news = $data; <br>$this->notifyObservers(); <br>} <br><br>public function getSportsNews() <br>{ <br>return $this->_sports_news; <br>} <br><br>private $_local_news; <br>public function setLocalNews($data) <br>{ <br>$this->_local_news = $data; <br>$this->notifyObservers(); <br>} <br><br>public function getLocalNews() <br>{ <br>return $this->_local_news; <br>} <br>} <br><br>class SportsNews implements Observer,DisplayElement <br>{ <br>private $_data = null; <br>public function update($observer) <br>{ <br>if($this->_data != $observer->getSportsNews()) <br>{ <br>$this->_data = $observer->getSportsNews(); <br>$this->display(); <br>} <br>} <br><br>public function display() <br>{ <br>echo $this->_data.date("Y-m-d H:i:s")."<br/>"; <br>} <br>} <br><br>class LocalNews implements Observer,DisplayElement <br>{ <br>private $_data = null; <br>public function update($observer) <br>{ <br>if($this->_data != $observer->getLocalNews()) <br>{ <br>$this->_data = $observer->getLocalNews(); <br>$this->display(); <br>} <br>} <br><br>public function display() <br>{ <br>echo $this->_data.date("Y-m-d H:i:s")."<br/>"; <br>} <br>} <br><br>// -- 实例化 --- <br><br>$objObserver = new NewsObserverable(); <br>$local = new LocalNews(); <br>$sports = new SportsNews(); <br><br>$objObserver->registerObserver($local); <br>$objObserver->registerObserver($sports); <br><br>$objObserver->setSportsNews("sports news 1 "); <br>$objObserver->setLocalNews("local news 1 "); <br>$objObserver->removeObserver($sports); <br>$objObserver->setLocalNews("local news 2 "); <br>$objObserver->setSportsNews("sports news 2 "); <br>$objObserver->removeObserver($local); <br>$objObserver->setLocalNews("local news 3 "); <br>