下載.jpg
模式定義
觀察者模式(observer pattern): 定義對象間的一種一對多(或一對一)的依賴關(guān)系衡查,當(dāng)被觀察者狀態(tài)發(fā)生改變時瘩欺,注冊的觀察者都會被通知。
觀察者模式又稱 發(fā)布-訂閱(publish/subscribe)模式拌牲、模型-視圖(Model/View)模式俱饿、源-監(jiān)聽器(Source/Listener)模式或從屬者(Dependents)模式
模式動機(jī)
建立一種對象和對象之間的依賴關(guān)系,一個對象發(fā)生改變時將自動通知其他對象塌忽,其他對象收到通知各自處理自己的業(yè)務(wù)邏輯拍埠。這里發(fā)生改變的對象稱為被觀察者,被通知的對象稱為觀察者土居。這些觀察者之間沒有關(guān)系枣购,可以根據(jù)業(yè)務(wù)需求添加或刪除觀察者,便于系統(tǒng)維護(hù)和擴(kuò)展擦耀。
模式結(jié)構(gòu)
- Subject(目標(biāo))
- ConcreteSubject(具體目標(biāo))
- Observer: 觀察者
- ConcreteObserver:具體觀察者
UML 圖
3742571717-582fba0c58319_articlex.png
代碼示例
代碼實現(xiàn)的場景: 假設(shè)有個一個商人賣東西棉圈,他的用戶有窮人和富人兩類,商人的商品可能會漲價也可能會降價 價格波動對窮人和富人的購買行為有不同的影響眷蜓。
分析: 這里的觀者目標(biāo)是 商品價格 分瘾,被觀察者是窮人和富人,商品價格變化將會通知窮人和富人吁系,窮人富人對購買做出不同的反映德召。
// 目標(biāo)
interface Observables
{
public function attach(Observer $ob);
public function detach(Observer $ob);
public function notify();
}
// 具體目標(biāo)
class Saler implements Observables
{
protected $obs = [];
protected $range = 0;
public function attach(Observer $ob)
{
$this->obs[] = $ob;
}
public function detach(Observer $ob)
{
foreach ($this->obs as $k=>$v){
if($v != $ob){
$this->obs[] = $v;
}
}
}
public function notify()
{
// $this->range 為0表示價格不變 大于0漲價 小于0降價
if($this->range != 0){
foreach ($this->obs as $ob) {
$ob->update($this);
}
}
}
public function increPrice($range)
{
$this->range = $range;
}
public function getRange()
{
return $this->range;
}
}
// 觀察者
interface Observer
{
public function update(Observables $obv);
}
//具體觀察者(窮人)
class PoorBuyer implements Observer{
public function update(Observables $obv)
{
if($obv->getRange()>0){
echo '窮人:漲價不買了</br>';
}else{
echo '窮人:降價了趕緊買</br>';
}
}
}
//具體觀察者(富人)
class RichBuyer implements Observer{
public function update(Observables $obv)
{
echo '富人:價格波動沒關(guān)系,繼續(xù)購買<br>';
}
}
模式應(yīng)用場景
- 一個抽象模型有兩個方面汽纤,其中一個方面依賴于另一個方面上岗。將這些方面封裝在獨(dú)立的對象中使它們可以各自獨(dú)立地改變和復(fù)用
- 一個對象的改變將導(dǎo)致其他一個或多個對象也發(fā)生改變,而不知道具體有多少對象將發(fā)生改變冒版,可以降低對象之間的耦合度液茎。
- 一個對象必須通知其他對象,而并不知道這些對象是誰。
- 需要在系統(tǒng)中創(chuàng)建一個觸發(fā)鏈捆等,A對象的行為將影響B(tài)對象滞造,B對象的行為將影響C對象……,可以使用觀察者模式創(chuàng)建一種鏈?zhǔn)接|發(fā)機(jī)制栋烤。