Php-SPL庫中的觀察者模式介面詳解
阿新 • • 發佈:2019-02-05
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();
<輸出>