php設(shè)計模式系列--觀察者模式

下載.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ī)制栋烤。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谒养,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子明郭,更是在濱河造成了極大的恐慌买窟,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薯定,死亡現(xiàn)場離奇詭異始绍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)话侄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門亏推,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人年堆,你說我怎么就攤上這事吞杭。” “怎么了变丧?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵芽狗,是天一觀的道長。 經(jīng)常有香客問我痒蓬,道長童擎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任攻晒,我火速辦了婚禮柔昼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘炎辨。我一直安慰自己,他們只是感情好聪姿,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布碴萧。 她就那樣靜靜地躺著,像睡著了一般末购。 火紅的嫁衣襯著肌膚如雪破喻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天盟榴,我揣著相機(jī)與錄音曹质,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛羽德,可吹牛的內(nèi)容都是我干的几莽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宅静,長吁一口氣:“原來是場噩夢啊……” “哼章蚣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起姨夹,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纤垂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后磷账,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體峭沦,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年逃糟,在試婚紗的時候發(fā)現(xiàn)自己被綠了吼鱼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡履磨,死狀恐怖蛉抓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情剃诅,我是刑警寧澤巷送,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站矛辕,受9級特大地震影響笑跛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜聊品,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一飞蹂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧翻屈,春花似錦陈哑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至厘贼,卻和暖如春界酒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嘴秸。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工毁欣, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留庇谆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓凭疮,卻偏偏與公主長得像饭耳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哭尝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容