Php-SPL库中的观察者模式接口详解

来源:互联网 发布:as3是一门编程语言吗 编辑:程序博客网 时间:2024/05/22 07:44

PHP-SPL标准库中实现了观察者模式接口,PHP内置提供了两个接口来供外部应用区实现这个模式。

<文档>http://www.php.net/manual/zh/splobserver.update.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();

<输出>