1. 程式人生 > >PHP —— 觀察者模式

PHP —— 觀察者模式

觀察者模式 當一個物件或事件發生變化時,其他的物件例項或者事件需要跟著發生相應改動或者進行相應動作的一對多關係可進行應用。

如:訂單狀態變化(支付完成)後需要進行,簡訊通知,公眾號推送等一系列相應操作時。可將訂單類看成一個被觀察者,簡訊通知類,公眾號通知,app推送等相關通知類視為觀察者。

具體實現和呼叫步驟:

分別實現 SplSubject、SplObserver類,在SplSubject實現類中例項化SplObjectStorage類進行物件的儲存

將觀察者物件分別加入被觀察者物件進行儲存

在物件發生變化後呼叫通知方法,逐個通知觀察者物件進行相關操作

好處:

避免進行無數的判斷操作,造成程式碼臃腫,不美觀

降低耦合度

<?php
header("Content-Type: text/html;charset=utf-8");
class test implements SplSubject{//被觀察者類

    public $_observer;
    public $num;
    public $ad;
    function __construct()
    {
        $this->_observer = new SplObjectStorage();
    }

    public function run(){
        $this->notify();
        print_r($this);
    }

    public function attach(SplObserver $observer)
    {
        // TODO: 新增觀察者物件
        $this->_observer->attach($observer);
    }

    public function detach(SplObserver $observer)
    {
        // TODO: Implement detach() method.
        $this->_observer->detach($observer);
    }

    public function notify()
    {
        // TODO: Implement notify() method.
        foreach ($this->_observer as $obj){
            $obj->update($this);
        }
    }
}

class checkNum implements SplObserver{
    public function update(SplSubject $subject)
    {
        // TODO: 根據通知更新
        $subject->num = "檢查次數";
    }
}

class checkAd implements SplObserver{
    public function update(SplSubject $subject)
    {
        // TODO: 根據通知更新
        $subject->ad = "檢查廣告";
    }

}

$test = new test();
$test->attach(new checkNum());
$test->attach(new checkAd());
$test->run();