php中spl库观察者模式接口

时间:2022-11-21 08:54:32


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();