1. 程式人生 > >php設計模式之———觀察者模式

php設計模式之———觀察者模式

觀察者模式

觀察者模式(Observer),當一個物件狀態發生改變時,依賴它的物件全部收到通知,並自動更新。

模式中的角色

  • 抽象被觀察者(抽象類,方便擴充套件)將觀察者物件存放在一個容器裡,該類提供一些介面,例如增加觀察者,撤銷觀察者,通知觀察者(notify)
  • 具體被觀察者(具體類,繼承被觀察者抽象類) 存入需要通知的觀察者,當觀察者需要update時,呼叫notify方法
  • 抽象觀察者(介面或抽象類)為具體的觀察者提供更新的介面,當被觀察者通知時進行update
  • 具體觀察者(具體類,繼承或實現抽象觀察者) 實現抽象觀察者的介面,自動update

phpDemo

抽象被觀察者

<?php 

abstract class EventGenerator{

    private $observer_arr = array();

    /*
        新增觀察者
     */
    public function addObserver( Observer $observer)
    {
        $this->observer_arr[] = $observer;
    }

    /*
        通知所有觀察者
     */
    public function notify()
    {
        foreach
($this->observer_arr as $observer) { $observer->update(); } } }

具體被觀察者

class Event  extends EventGenerator{

    public function trigger()
    {   

        echo 'event happen!<br/>';
        //當事件發生時,通知所有觀察者
        $this->notify();
    }

}

抽象觀察者

<?php 

interface Observer{
    //自動更新
    function update();
}

具體觀察者

class Observer1 implements Observer{

    //實現update方法
    public function update()
    {
        echo 'observer1 update<br/>';
    }
}

class Observer2 implements Observer{
    //實現update方法
    public function update()
    {
        echo 'observer2 update<br/>';
    }
}

測試程式碼

$obj = new Event();
//新增觀察者
$obj->addObserver(new Observer1());
$obj->addObserver(new Observer2());
$obj->trigger();

模式總結

  • 優點:觀察者模式實現了低耦合,非侵入式的通知和自動更新機制
  • 缺點:依賴關係並未完全解除,抽象通知者依舊依賴抽象的觀察者
  • 試用場景:1.當一個物件的改變需要給變其它物件時,而且它不知道具體有多少個物件有待改變時; 2.一個抽象某型有兩個方面,當其中一個方面依賴於另一個方面,這時用觀察者模式可以將這兩者封裝在獨立的物件中使它們各自獨立地改變和複用