2010-08-30 86 views
4

我需要的情况下一些实际的例子当开发一个网站的时候。(使用PHP)何时在开发网站时使用观察者模式?

我有我可以使用观察者模式的一个“当用户发布的文章(主题),类RSS和类EMAIL(观察员)将修改rss并发送电子邮件给管理员“,但我甚至不知道这是否是一个好例子。

你在哪里使用观察者模式?

BTW:这不是一门功课,我只是躺在这里想着这个模式:)

EDITED 我更好奇“什么时候做”,而不是“如何做它“

回答

2

我有一个对象(单元格)的集合(数组)作为”cellCollection“对象的属性。为了减少内存使用量,每个单元格实际上都是以缓存(磁盘文件,APC,memcache等)的序列化形式保存的,而“cellCollection”对象保存指向缓存位置的指针数组。我使用observer模式,以便每当“cell”对象被修改时通知“cellCollection”对象,以便它可以更新缓存中该“cell”对象的主副本,并根据需要调整其指针。

+0

我migath听起来像一个noob在这里,但...你可以做到这一点在PHP?缓存中需要什么样的数据?你有链接,我可以学习这样做吗? – pleasedontbelong 2010-08-30 22:14:11

+0

是的,你可以用PHP来完成,否则我将无法做到!有问题的应用程序是PHPExcel,其中Excel工作表可以包含数千个单元,其中每个单元都是由工作表的cellCollection对象引用的对象。一些关于使用观察者模式的文章:http://www.devshed.com/c/a/PHP/An-Introduction-to-the-Observer-Pattern-in-PHP/或http://devzone.zend .com/article/5或http://gauravjassal.com/php/observer-pattern-in-php-part-1/ – 2010-08-30 23:30:31

1

您通常不需要多或少无状态PHP的观察者模式。

但是,请考虑以下内容。我跳过了一些代码,但你应该可以填写空白。

class Stats extends Observer implements SplObserver 
{ 
    private function updateStats($action) { } 
    public function update(SplSubject $subject) 
    { 
     if ($subject instanceOf Article) 
     { 
      if ($subject->notice == Article::NOTICE_POSTED_ARTICLE) 
      { 
       $this->updateStats($subject->notice); 
      } 
     } 
    } 
} 

class Article extends Subject implements SplSubject 
{ 
    const NOTICE_POSTED_ARTICLE = "Article Posted"; 

    private $observers; 
    public $notice; 

    public function postArticle($text) 
    { 
     $this->notice = self::NOTICE_POSTED_ARTICLE; 
     $this->notify(); 
    } 

    public function notify() 
    { 
     foreach ($this->observers as $observer) 
     { 
      $observer->update($this); 
     } 
    } 
} 
+0

因为你的类文章扩展了“Subject”,如果notify()不会更好, $ observers和$ notice在父类中的位置? 无论如何它作为一个例子,thxs – pleasedontbelong 2010-08-30 22:19:34

0

我每次发生“行动”时都会使用它。这些东西包括每种实体(用户,内容,标签等)的基本CRUD,但包括许多其他操作(用户登录,用户注销,模块加载,模块退出等)。

我还喜欢在东西被加载之后,或者在东西被保存(插入或更新到数据库)之前,或者在东西(例如表单)被渲染以改变数据结构之前,使用Visitor模式。

操作可能会在页面加载中发生多次。