在开发网站时何时使用观察者模式?

时间:2010-08-30 21:31:20

标签: php design-patterns observer-pattern

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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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);
        }
    }
}

答案 2 :(得分:0)

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

我还喜欢在加载某些内容之后或者在某些内容被保存(插入或更新到数据库之前)之前或者在呈现某些内容(例如表单)以改变数据结构之前使用Visitor模式。 / p>

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