我需要一些实际的例子,当我在开发网站时可以使用观察者模式..(使用php)
我有一个“当用户发布文章(主题)时,类RSS和类EMAIL(观察者)将修改rss并向管理员发送电子邮件”,但是我我甚至不确定这是一个很好的例子。
你在哪里使用观察者模式?
顺便说一下:这不是作业,我只是在这里思考这种模式:)EDITED 我对“什么时候做”而不是“如何做”更加好奇
答案 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>
在页面加载中,操作可能会多次发生。