在php5.0.1版本中提供了SplSubject和SplObserver两个接口帮助开发这实现观察者模式。
被观察者:
SplSubject {/* 方法 */abstract public void attach ( SplObserver $observer )abstract public void detach ( SplObserver $observer )abstract public void notify ( void )}
观察者:
SplObserver {/* 方法 */abstract public void update ( SplSubject $subject )}
观察者模式的简单理解:
在官网API中提供了一个例子是这样的。现在有几种报纸,诸如美国日报、中国日报之类的,每类报纸都有固定的订阅者。现在有个需求是:每当报纸发布新的新闻的时候,其相对应的订阅者都可以收到该新闻的内容。
这样的例子在日常开发中很常见,诸如我们订阅了一些科技杂志或者桃色新闻,然后,在我们的注册邮箱中,边会是不是的收到一些邮件。于是我们可以这样简单的理解。
新闻杂志是被观察者,我们作为观察者,新闻杂志有个发布新闻的小窗口,每当这个窗口有迅猛的爆料时,我们立马虎视眈眈的发现了。于是,我们书写代码:
<?php/** * 定义被观察者:新闻杂志 */class Newspaper implements SplSubject{ private $name; private $observers = array(); private $content; public function __construct($name){ $this->name = $name; } public function attach (SplObserver $observer ){ $this->observers[] = $observer; } public function detach (SplObserver $observer ){ $key = array_search($observer, $observers); if($key){ unset($this->observers[$key]); } } public function notify( ){ foreach ($this->observers as $value) { $value->update($this); } } public function getContent(){ return $this->content; } public function breadOut($content){ $this->content = $content; $this->notify(); }}/** * 定义观察者:订阅用户 */class Reader implements SplObserver{ private $name; public function __construct($name){ $this->name = $name; } public function update(SplSubject $subject) { echo $this->name.' is reading breakout news <b>'.$subject->getContent().'</b><br>'; }}/** * 实例化新闻杂志 * @var Newspaper */$USANews = new Newspaper('USA NEWS');$CHINANews = new Newspaper('CHINA NEWS');/** * 实例化读者 * @var Reader */$jack = new Reader('jack');$tom = new Reader('tom');/** * 订阅用户在这一刻订阅了该报纸 */$USANews->attach($jack);$USANews->attach($tom);$sange = new Reader('zhangsan');$siye = new Reader('lisi');$CHINANews->attach($sange);$CHINANews->attach($siye);/** * 新闻杂志小窗口打开,开始爆料 */$USANews->breadOut('USA break out');$CHINANews->breadOut('CHINA break out');
运行结果如下:
jack is reading breakout news USA break outtom is reading breakout news USA break outzhangsan is reading breakout news CHINA break outlisi is reading breakout news CHINA break out
每类报纸相对应的订阅者都收到了该类报纸的爆料。
原标题:php设计模式
关键词:PHP