第一版的設計**如下:
weatherdata.php
<?php
/** * 氣象站類,用於提供氣象資料,資料變化時及時推送至使用者的裝置
* * @author ben
* */
class weatherdata
/*** 當資料變更時向使用者推送即時資料
*/public function datachanged()
}
**的壞味道:
氣象站類weatherdata與使用者的裝置類mac、iphone、iwatch類之間存在著強耦合關係,而真實的場景中使用者可能隨時會取消業務,或者為新的電子產品訂閱該業務,這就意味著我們今後將會頻繁的修改這個檔案中的**。
下面我們來看看觀察者模式是怎麼為我們解決這個難題的。
要理解觀察者模式,可以結合真實的案例,比如說訂閱報紙,仔細想想在這樣的場景中存在哪幾種元素:
1、報紙的發布者;
2、報紙的訂閱者;
發布者與訂閱者組成了觀察者的兩個基本要素。具體用uml類圖描述如下:
具體的實現**:
subject.php
<?php
abstract class subject
public function removeobserver($key) }
abstract function notify();
// foreach ($this->observer as $observer)
}
equipment.php
<?php
abstract class equipment
weatherdata.php
<?php
require_once 'subject.php';
class weatherdata extends subject }
public function datachange($temperature, $pressure, $humidity)
}
mac.php
<?php
require_once 'equipment.php';
class mac extends equipment
/* (non-phpdoc)
* @see equipment::display()
*/public function display()
}
iwatch.php
<?php
require_once 'equipment.php';
class iwatch extends equipment
/* (non-phpdoc)
* @see equipment::display()
*/public function display()
}
iphone.php
<?php
require_once 'equipment.php';
class iphone extends equipment
/* (non-phpdoc)
* @see equipment::display()
*/public function display()
}
index.php
<?php
require_once 'weatherdata.php';
require_once 'iwatch.php';
require_once 'iphone.php';
require_once 'mac.php';
$subject = new weatherdata();
$observer1 = new iwatch();
$observer2 = new iphone();
$observer3 = new mac();
$subject->addobserver('iwatch', $observer1);
$subject->addobserver('iphone', $observer2);
$subject->addobserver('mac', $observer3);
$subject->datachange('38攝氏度', '氣壓好高啊', '很濕潤');
執行結果是:
current conditions:
temperature:38攝氏度;
pressure:氣壓好高啊;
humidity:很濕潤;
--from iwatch client
current conditions:
temperature:38攝氏度;
pressure:氣壓好高啊;
humidity:很濕潤;
--from iphone client
current conditions:
temperature:38攝氏度;
pressure:氣壓好高啊;
humidity:很濕潤;
--from mac client
當然php已經幫我們準備好了兩個介面,我們沒有必要重造輪子,這兩個介面分別是splobserver和splsubject,關於這兩個介面的定義,可以檢視以下官方文件:
splobserver:
splsubject:
使用這兩個介面之後我們進一步修改後的**清單如下:
index.php
<?php
require_once 'weatherdata.php';
require_once 'iwatch.php';
require_once 'iphone.php';
require_once 'mac.php';
$subject = new weatherdata();
$observer1 = new iwatch();
$observer2 = new iphone();
$observer3 = new mac();
$subject->attach($observer1);
$subject->attach($observer2);
$subject->attach($observer3);
$subject->datachange('38攝氏度', '氣壓好高啊', '很濕潤');
iphone.php
<?php
class iphone implements splobserver
/* (non-phpdoc)
* @see equipment::display()
*/public function display()
}
iwatch.php
<?php
class iwatch implements splobserver
/* (non-phpdoc)
* @see equipment::display()
*/public function display()
}
mac.php
<?php
class mac implements splobserver
/* (non-phpdoc)
* @see equipment::display()
*/public function display()
}
weatherdata.php
<?php
class weatherdata implements splsubject }
public function datachange($temperature, $pressure, $humidity)
public function gettemperature()
public function getpressure()
public function gethumidity()
/* (non-phpdoc)
* @see splsubject::attach()
*/public function attach(splobserver $observer)
/* (non-phpdoc)
* @see splsubject::detach()
*/public function detach(splobserver $observer) }
}
php設計 PHP常用設計模式
1 單例模式指在整個應用中只有乙個物件例項的設計模式 class single public rand static private instance 類直接呼叫 final private function construct private防止外部new this rand mt rand 1,...
PHP設計模式 工廠設計模式
工廠模式,如其名稱一樣,就是乙個工廠,用於建立產品。使用工廠模式的好處就是請求者只需要發出請求,具體的例項化過程交給工廠模式,省去了new的過程。並且如果後期開發,類名發生變化,只需要調整工廠模式中一行new相關 不需要修改一大堆 最簡單的工廠模式,實際上就是乙個switch case結構,通過傳入...
php設計模式
php設計模式介紹 導言 php設計模式介紹 第一章 程式設計慣用法 php設計模式介紹 第二章 值物件模式 php設計模式介紹 第三章 工廠模式 php設計模式介紹 第四章 單條模式 php設計模式介紹 第五章 註冊模式 php設計模式介紹 第六章 偽物件模式 php設計模式介紹 第七章 策略模式...