【问题标题】:when to use the observer pattern when developing websites?开发网站时什么时候使用观察者模式?
【发布时间】:2010-08-30 21:31:20
【问题描述】:

我需要一些在开发网站时可以使用观察者模式的实际案例..(使用 php)

我有一个“当用户发布文章(主题)时,RSS 类和 EMAIL 类(观察者)将修改 rss 并向管理员发送电子邮件”,但我'甚至不确定这是否是一个很好的例子..

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

顺便说一句:这不是作业,我只是躺在这里思考这种模式:)

已编辑 我对“何时做”而不是“如何做”更感兴趣

【问题讨论】:

    标签: php design-patterns observer-pattern


    【解决方案1】:

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

    【讨论】:

    • 我在这里听起来像个菜鸟,但是...你能在 php 中做到这一点吗?您需要缓存中的哪些数据?你有我可以学习这样做的链接吗?
    • 是的,你可以用 PHP 做,否则我做不到!有问题的应用程序是 PHPExcel,其中一个 Excel 工作表可以有数千个单元格,每个单元格都是由工作表的 cellCollection 对象引用的对象。关于使用观察者模式的几篇文章:devshed.com/c/a/PHP/… or devzone.zend.com/article/5 or gauravjassal.com/php/observer-pattern-in-php-part-1
    【解决方案2】:

    在或多或少无状态的 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);
            }
        }
    }
    

    【讨论】:

    • 既然你的类文章扩展了“主题”,如果notify()、$observers 和$notice 在父类中的位置会不会更好?无论如何它可以作为一个例子,thxs
    【解决方案3】:

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

    我也更喜欢在加载某些内容之后或保存某些内容(插入或更新到数据库)之前或在渲染某些内容(例如表单)之前使用Visitor 模式来改变数据的结构。

    动作可以在页面加载中发生多次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多