被观察对象通过添加一个方法注册观察者,使本身变得可观察,在执行可观察方法时,可发送消息给已注册的观察者,使得对象间可以相互对话。
以下是观察者模式的示例:
// 观察者接口
interface IObserver
{
// 观察者接收被观察者的消息,$sender是被观察者,$args是相应的参数
function receive( $sender, $args );
}
// 被观察者接口
interface IObservable
{
// 添加观察者
function addObserver( $observer );
}
// 被观察者
class Observable implements IObservable
{
// 用以保存观察者
private $_observers = array();
// 可观察方法
public function action( $name )
{
echo "被观察者有小动作了~\n";
// 把被观察者的小动作告诉所有观察者,执行被观察者的方法记录下来
foreach( $this->_observers as $obs ) {
$obs->receive( get_class(), $name );
}
}
// 添加观察者
public function addObserver( $observer )
{
$this->_observers []= $observer;
}
}
// 观察者
class Observer implements IObserver
{
public function receive( $sender, $args )
{
echo( "The action '$args' in $sender\n" );
}
}
$observable = new Observable();
// 首先要添加观察者
$observable->addObserver( new Observer() );
$observable->action( "run" );
观察者和被观察者接口规范方法和相应参数,在被观察者内部保存所有观察者,可观察方法执行,则通知观察者,观察者接收。