php設(shè)計(jì)模式 Observer(觀察者模式)
更新時(shí)間:2011年06月26日 10:51:44 作者:
定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,以便當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并自動(dòng)刷新 能夠便利地創(chuàng)建查看目標(biāo)對(duì)象狀態(tài)的對(duì)象,并且提供與核心對(duì)象非耦合的指定功能
復(fù)制代碼 代碼如下:
<?php
/**
* 觀察者模式
*
* 定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,以便當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并自動(dòng)刷新
* 能夠便利地創(chuàng)建查看目標(biāo)對(duì)象狀態(tài)的對(duì)象,并且提供與核心對(duì)象非耦合的指定功能
* 插件系統(tǒng)
*/
class Observerable
{
private $_observers = array();
public function registerObserver($observer)
{
$this->_observers[] = $observer;
}
public function removeObserver($observer)
{
$key = array_search($observer,$this->_observers);
if(!($key === false))
{
unset($this->_observers[$key]);
}
}
public function notifyObservers()
{
foreach($this->_observers as $observer)
{
if($observer instanceof Observer) $observer->update($this);
}
}
}
interface Observer
{
public function update($observer);
}
interface DisplayElement
{
public function display();
}
// -- 實(shí)例類定義
class NewsObserverable extends Observerable
{
private $_sports_news;
public function setSportsNews($data)
{
$this->_sports_news = $data;
$this->notifyObservers();
}
public function getSportsNews()
{
return $this->_sports_news;
}
private $_local_news;
public function setLocalNews($data)
{
$this->_local_news = $data;
$this->notifyObservers();
}
public function getLocalNews()
{
return $this->_local_news;
}
}
class SportsNews implements Observer,DisplayElement
{
private $_data = null;
public function update($observer)
{
if($this->_data != $observer->getSportsNews())
{
$this->_data = $observer->getSportsNews();
$this->display();
}
}
public function display()
{
echo $this->_data.date("Y-m-d H:i:s")."<br/>";
}
}
class LocalNews implements Observer,DisplayElement
{
private $_data = null;
public function update($observer)
{
if($this->_data != $observer->getLocalNews())
{
$this->_data = $observer->getLocalNews();
$this->display();
}
}
public function display()
{
echo $this->_data.date("Y-m-d H:i:s")."<br/>";
}
}
// -- 實(shí)例化 ---
$objObserver = new NewsObserverable();
$local = new LocalNews();
$sports = new SportsNews();
$objObserver->registerObserver($local);
$objObserver->registerObserver($sports);
$objObserver->setSportsNews("sports news 1 ");
$objObserver->setLocalNews("local news 1 ");
$objObserver->removeObserver($sports);
$objObserver->setLocalNews("local news 2 ");
$objObserver->setSportsNews("sports news 2 ");
$objObserver->removeObserver($local);
$objObserver->setLocalNews("local news 3 ");
您可能感興趣的文章:
- PHP設(shè)計(jì)模式之觀察者模式(Observer)詳細(xì)介紹和代碼實(shí)例
- PHP中常用的三種設(shè)計(jì)模式詳解【單例模式、工廠模式、觀察者模式】
- PHP設(shè)計(jì)模式之觀察者模式定義與用法示例
- PHP設(shè)計(jì)模式之中介者模式(Mediator Pattern)入門(mén)與應(yīng)用案例詳解
- PHP設(shè)計(jì)模式之迭代器(Iterator)模式入門(mén)與應(yīng)用詳解
- PHP設(shè)計(jì)模式之解釋器(Interpreter)模式入門(mén)與應(yīng)用詳解
- PHP設(shè)計(jì)模式之工廠模式(Factory)入門(mén)與應(yīng)用詳解
- php設(shè)計(jì)模式之適配器模式原理、用法及注意事項(xiàng)詳解
- php設(shè)計(jì)模式 Template (模板模式)
- php設(shè)計(jì)模式 Proxy (代理模式)
- PHP常用的三種設(shè)計(jì)模式匯總
- PHP設(shè)計(jì)模式之觀察者模式入門(mén)與應(yīng)用案例詳解
相關(guān)文章
Yii2使用駝峰命名的形式訪問(wèn)控制器(實(shí)例講解)
下面小編就為大家?guī)?lái)一篇Yii2使用駝峰命名的形式訪問(wèn)控制器(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
PHP簡(jiǎn)單實(shí)現(xiàn)記錄網(wǎng)站訪問(wèn)量功能示例
這篇文章主要介紹了PHP簡(jiǎn)單實(shí)現(xiàn)記錄網(wǎng)站訪問(wèn)量功能,涉及php針對(duì)文件加鎖讀寫(xiě)及日期時(shí)間轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2018-06-06
dedecms系統(tǒng)的廣告設(shè)置代碼 基礎(chǔ)版本
dedecms系統(tǒng)的廣告設(shè)置代碼 基礎(chǔ)版本,需要的朋友可以參考下。2010-04-04
js和php郵箱地址驗(yàn)證的實(shí)現(xiàn)方法
這篇文章主要介紹了js和php郵箱地址驗(yàn)證的實(shí)現(xiàn)方法,有需要的朋友可以參考一下2014-01-01
PHP取二進(jìn)制文件頭快速判斷文件類型的實(shí)現(xiàn)代碼
以下代碼就展示了自己通過(guò)讀取文件頭信息來(lái)識(shí)別文件的真實(shí)類型。需要的朋友可以過(guò)來(lái)參考下2013-08-08

