php設計模式系列--觀察者模式

圖片描述

模式定義

觀察者模式(observer pattern): 定義對象間的一種一對多(或一對一)的依賴關係,當被觀察者狀態發生改變時,註冊的觀察者都會被通知。
觀察者模式又稱 發佈-訂閱(publish/subscribe)模式、模型-視圖(Model/View)模式、源-監聽器(Source/Listener)模式或從屬者(Dependents)模式this

模式動機

創建一種對象和對象之間的依賴關係,一個對象發生改變時將自動通知其餘對象,其餘對象收到通知各自處理本身的業務邏輯。這裏發生改變的對象稱爲被觀察者,被通知的對象稱爲觀察者。這些觀察者之間沒有關係,能夠根據業務需求添加或刪除觀察者,便於系統維護和擴展。spa

模式結構

  • Subject(目標)
  • ConcreteSubject(具體目標)
  • Observer: 觀察者
  • ConcreteObserver:具體觀察者

UML 圖
圖片描述code

代碼示例

代碼實現的場景: 假設有個一個商人賣東西,他的用戶有窮人和富人兩類,商人的商品可能會漲價也可能會降價 價格波動對窮人和富人的購買行爲有不一樣的影響。
分析: 這裏的觀者目標是 商品價格 ,被觀察者是窮人和富人,商品價格變化將會通知窮人和富人,窮人富人對購買作出不一樣的反映。server

// 目標
interface Observables
{
    public function attach(Observer $ob);
    public function detach(Observer $ob);
    public function notify();
}



// 具體目標

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 '富人:價格波動不要緊,繼續購買<br>';
}
}

模式應用場景

  • 一個抽象模型有兩個方面,其中一個方面依賴於另外一個方面。將這些方面封裝在獨立的對象中使它們能夠各自獨立地改變和複用
  • 一個對象的改變將致使其餘一個或多個對象也發生改變,而不知道具體有多少對象將發生改變,能夠下降對象之間的耦合度。
  • 一個對象必須通知其餘對象,而並不知道這些對象是誰。
  • 須要在系統中建立一個觸發鏈,A對象的行爲將影響B對象,B對象的行爲將影響C對象……,能夠使用觀察者模式建立一種鏈式觸發機制。
相關文章
相關標籤/搜索