php設(shè)計(jì)模式之觀察者模式的應(yīng)用詳解
更新時(shí)間:2013年05月21日 14:52:49 作者:
本篇文章是對(duì)php中的觀察者模式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
觀察者模式:定義對(duì)象間一種一對(duì)多的依賴(lài)關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴(lài)于它的對(duì)象都得到通知并自動(dòng)更新。
觀察者類(lèi):
1.抽象主題角色:主題角色將所有對(duì)觀察者對(duì)象的引用保存在一個(gè)集合中,每個(gè)主題可以任意多個(gè)觀察者。抽象主題提供了增加和刪除觀察者對(duì)象的接口。
2.抽象觀察者角色:為所有的具體觀察者定義一個(gè)接口,在觀察的主題發(fā)生改變時(shí)更新自己
3.具體主題角色:存儲(chǔ)相關(guān)狀態(tài)到具體觀察者對(duì)象,當(dāng)具體主題的內(nèi)部狀態(tài)發(fā)生改變時(shí),給所有登記過(guò)的觀察者發(fā)出通知。具體主題角色通常用一個(gè)具體子類(lèi)實(shí)現(xiàn)。
4.具體觀察者角色:存儲(chǔ)一個(gè)具體主題對(duì)象,存儲(chǔ)相關(guān)狀態(tài),實(shí)現(xiàn)抽象觀察者角色所要求的更新接口,以使得其自身狀態(tài)和主題的狀態(tài)保持一致
作用:
1. 觀察者模式的耦合度較小
2.支持廣播通信
<?php
//抽象主題
interface Subject{
public function attach($observer);
public function detach($observer);
public function notifyObservers();
}
//具體主題
class ConcreateSubject implements Subject{
private $_observers;
public function __construct(){
$this->_observers = array();
}
public function attach($observer){
return array_push($this->_observers,$observer);
}
public function detach($observer){
$index = array_search($observer,$this->_observers);
if($index === false || !array_key_exists($index,$this->_observers)){
return false;
}
unset($this->_observer[$index]);
return true;
}
public function notifyObservers(){
if(!is_array($this->_observers)){
return false;
}
foreach($this->_observers as $observer){
$observer->update();
}
return true;
}
}
//抽象觀察者
interface Observer{
public function update();
}
//具體觀察者
class ConcreteObserver implement Observer{
private $_name;
public function __construct($name){
$this->_name = $name;
}
public function update(){
echo 'Observer',$this->_name.'has notified<br/>';
}
}
//客戶端
class Client{
public static function main(){
$subject = new ConcreteSubject();
//新增第一個(gè)觀察者
$observer1 = new ConcreteObserver('Martin');
$subject->attach($observer1);
//通知
$subject->notifyObservers();
//新增第二個(gè)觀察者
$observer2 = new ConcreteObserver('jaky');
$subject->attach($observer2);
//通知
$subject->notifyObservers();
//刪除觀察者1
$subject->deatch($observer1);
//通知
$subject->notifyObservers();
}
}
Client::main();
?>
觀察者類(lèi):
1.抽象主題角色:主題角色將所有對(duì)觀察者對(duì)象的引用保存在一個(gè)集合中,每個(gè)主題可以任意多個(gè)觀察者。抽象主題提供了增加和刪除觀察者對(duì)象的接口。
2.抽象觀察者角色:為所有的具體觀察者定義一個(gè)接口,在觀察的主題發(fā)生改變時(shí)更新自己
3.具體主題角色:存儲(chǔ)相關(guān)狀態(tài)到具體觀察者對(duì)象,當(dāng)具體主題的內(nèi)部狀態(tài)發(fā)生改變時(shí),給所有登記過(guò)的觀察者發(fā)出通知。具體主題角色通常用一個(gè)具體子類(lèi)實(shí)現(xiàn)。
4.具體觀察者角色:存儲(chǔ)一個(gè)具體主題對(duì)象,存儲(chǔ)相關(guān)狀態(tài),實(shí)現(xiàn)抽象觀察者角色所要求的更新接口,以使得其自身狀態(tài)和主題的狀態(tài)保持一致
作用:
1. 觀察者模式的耦合度較小
2.支持廣播通信
復(fù)制代碼 代碼如下:
<?php
//抽象主題
interface Subject{
public function attach($observer);
public function detach($observer);
public function notifyObservers();
}
//具體主題
class ConcreateSubject implements Subject{
private $_observers;
public function __construct(){
$this->_observers = array();
}
public function attach($observer){
return array_push($this->_observers,$observer);
}
public function detach($observer){
$index = array_search($observer,$this->_observers);
if($index === false || !array_key_exists($index,$this->_observers)){
return false;
}
unset($this->_observer[$index]);
return true;
}
public function notifyObservers(){
if(!is_array($this->_observers)){
return false;
}
foreach($this->_observers as $observer){
$observer->update();
}
return true;
}
}
//抽象觀察者
interface Observer{
public function update();
}
//具體觀察者
class ConcreteObserver implement Observer{
private $_name;
public function __construct($name){
$this->_name = $name;
}
public function update(){
echo 'Observer',$this->_name.'has notified<br/>';
}
}
//客戶端
class Client{
public static function main(){
$subject = new ConcreteSubject();
//新增第一個(gè)觀察者
$observer1 = new ConcreteObserver('Martin');
$subject->attach($observer1);
//通知
$subject->notifyObservers();
//新增第二個(gè)觀察者
$observer2 = new ConcreteObserver('jaky');
$subject->attach($observer2);
//通知
$subject->notifyObservers();
//刪除觀察者1
$subject->deatch($observer1);
//通知
$subject->notifyObservers();
}
}
Client::main();
?>
相關(guān)文章
php調(diào)用快遞鳥(niǎo)接口實(shí)例代碼
這篇文章主要介紹了php調(diào)用快遞鳥(niǎo)接口實(shí)例代碼,需要的朋友可以參考下2017-10-10PHP如何實(shí)現(xiàn)阿里云短信sdk靈活應(yīng)用在項(xiàng)目中的方法
這篇文章主要介紹了PHP如何實(shí)現(xiàn)阿里云短信sdk靈活應(yīng)用在項(xiàng)目中的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-06-06php多功能圖片處理類(lèi)分享(php圖片縮放類(lèi))
本文提供的php類(lèi)用于完成圖片縮放,水印添加,當(dāng)水印圖超過(guò)目標(biāo)圖片尺寸時(shí),水印圖能自動(dòng)適應(yīng)目標(biāo)圖片而縮小,當(dāng)水印圖超過(guò)目標(biāo)圖片尺寸時(shí),水印圖能自動(dòng)適應(yīng)目標(biāo)圖片而縮小,需要的朋友可以參考下2014-03-03PHP+Mysql+jQuery中國(guó)地圖區(qū)域數(shù)據(jù)統(tǒng)計(jì)實(shí)例講解
使用過(guò)百度統(tǒng)計(jì)或者cnzz統(tǒng)計(jì)的童鞋應(yīng)該知道,后臺(tái)有一個(gè)地圖統(tǒng)計(jì),不同訪問(wèn)量的省份顯示的顏色也不一樣,今天我將帶領(lǐng)大家開(kāi)發(fā)一個(gè)這樣的案例。2015-10-10CI框架封裝的常用圖像處理方法(縮略圖,水印,旋轉(zhuǎn),上傳等)
這篇文章主要介紹了CI框架封裝的常用圖像處理方法,涉及針對(duì)圖像的縮略圖、水印、旋轉(zhuǎn)、上傳等操作,需要的朋友可以參考下2016-11-11