你的位置:首页 > ASP.net教程

[ASP.net教程]php设计模式


在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

每类报纸相对应的订阅者都收到了该类报纸的爆料。