1. 程式人生 > >Php-SPL庫中的觀察者模式介面詳解

Php-SPL庫中的觀察者模式介面詳解

PHP-SPL標準庫中實現了觀察者模式介面,PHP內建提供了兩個介面來供外部應用區實現這個模式。

SplSubject 介面

SplSubject代表著被觀察的物件,其結構:

interface SplSubject{
//新增(註冊)一個觀察者
public function attach(SplObserver $observer);
//刪除一個觀察者
public function detach(SplObserver $observer);
//當狀態發生改變時,通知所有觀察者
    public function notify();
}

SplObserver 介面

SplObserver 代表著充當觀察者的物件,其結構:

interface SplObserver{
  //在目標發生改變時接收目標傳送的通知;當關注的目標呼叫其notify()時被呼叫 
  public function update(SplSubject $subject);
}

<說明>

SplSubject維護了一個特定的狀態,在其狀態改變時呼叫 notify()方法,一旦這個方法被呼叫,任何先前通過 attach()方法註冊上來的 SplObserver物件都會以呼叫其 update()方法的方式被更新。

程式設計OOP

class MyObserver1 implements SplObserver
{
    public function update(SplSubject $subject)
    {
        echo "MyObserver1 updated\n";
    }
}

class MyObserver2 implements SplObserver
{
    public function update(SplSubject $subject)
    {
        echo "MyObserver2 updated\n";
    }
}

class MySubject implements SplSubject
{
    private $_observers;
    private $_name;

    public function __construct($name)
    {
        $this->_observers = new SplObjectStorage();
        $this->_name = $name;
    }

    public function attach(SplObserver $observer)
    {
        $this->_observers->attach($observer);
    }

    public function detach(SplObserver $observer)
    {
        $this->_observers->detach($observer);
    }

    public function notify()
    {
        foreach ($this->_observers as $observer) {
            $observer->update($this);
        }
    }

    public function getName()
    {
        return $this->_name;
    }
}

測試用例Test Case:

<程式碼>

class testDriver
{
    public function run()
    {
        $observer1 = new MyObserver1();
        $observer2 = new MyObserver2();
        $subject = new MySubject("test");
        $subject->attach($observer1);
        $subject->attach($observer2);
        $subject->notify();
    }
}

$test = new testDriver();
$test->run();

<輸出>