php設(shè)計(jì)模式 Observer(觀察者模式)
更新時(shí)間:2011年06月26日 10:51:44 作者:
定義對(duì)象間的一種一對(duì)多的依賴(lài)關(guān)系,以便當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴(lài)于它的對(duì)象都得到通知并自動(dòng)刷新 能夠便利地創(chuàng)建查看目標(biāo)對(duì)象狀態(tài)的對(duì)象,并且提供與核心對(duì)象非耦合的指定功能
復(fù)制代碼 代碼如下:
<?php
/**
* 觀察者模式
*
* 定義對(duì)象間的一種一對(duì)多的依賴(lài)關(guān)系,以便當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴(lài)于它的對(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í)例類(lèi)定義
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)文章
php過(guò)濾所有惡意字符(批量過(guò)濾post,get敏感數(shù)據(jù))
最近dedecms報(bào)漏洞不斷,這里分享下php的過(guò)濾函數(shù),大牛飄過(guò)吧,給小黑闊們學(xué)習(xí)交流用2014-03-03PHP實(shí)現(xiàn)向關(guān)聯(lián)數(shù)組指定的Key之前插入元素的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)向關(guān)聯(lián)數(shù)組指定的Key之前插入元素的方法,涉及php針對(duì)數(shù)組的遍歷、判斷、獲取、插入等相關(guān)操作技巧,需要的朋友可以參考下2017-06-06php用數(shù)組返回?zé)o限分類(lèi)的列表數(shù)據(jù)的代碼
php自定義函數(shù)之用數(shù)組返回?zé)o限分類(lèi)的列表數(shù)據(jù),這樣的實(shí)現(xiàn)可以提高執(zhí)行的效率不要每次都從數(shù)據(jù)庫(kù)讀取數(shù)據(jù)。2010-08-08PHP基于curl post實(shí)現(xiàn)發(fā)送url及相關(guān)中文亂碼問(wèn)題解決方法
這篇文章主要介紹了PHP基于curl post實(shí)現(xiàn)發(fā)送url及相關(guān)中文亂碼問(wèn)題解決方法,結(jié)合具體實(shí)例形式分析了php使用curl實(shí)現(xiàn)post數(shù)據(jù)發(fā)送及content-type相關(guān)設(shè)置操作技巧,需要的朋友可以參考下2017-11-11PHP采用get獲取url漢字出現(xiàn)亂碼的解決方法
這篇文章主要介紹了PHP采用get獲取url漢字出現(xiàn)亂碼的解決方法,是很多PHP程序員都曾遇到的問(wèn)題,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-11-11