我应该使用观察者模式吗?
|
在某种情况下,我认为使用Observer模式最有意义,但是我不确定实现的最佳方法。
说我有2张桌子
User
id
name
email
...
Order
id
user_id
total
...
两者都是从ORM扩展的类,并且父类具有save()方法
class User extends ORM { }
$user = new User(1);
$user->name = \'New Name\'
$user->save();
我也有一个xml feed,它存储了用户的一些列和订单的一些列。首次访问该提要时,它会从数据库中提取所需的信息,并生成xml提要,并将对象存储在memcached中。提要的任何后续命中都会从memcached中提取。
我想做的是,如果某些字段按用户或顺序更改,我想更新memcached密钥。由于我不存储用户的所有字段,也不存储订单的所有字段,因此我不希望仅在任何save()调用中都发生此事件(而且xml生成脚本会占用大量数据库资源)
通过阅读有关Observer模式的内容,我认为User / Order对象还将实现SplSubject,并在其构造函数中附加一个XMLObserver。我将不得不重写save()方法以通知任何附加的观察者。如果某些字段发生更改,我只会打电话通知。 XMLObserver将更新memcached。
class User extends ORM implements SplSubject
{
private $observers = array();
function __construct()
{
$this->attach(new XMLObserver);
parent::__construct();
}
function attach(SplObserver $observer)
{
$id = spl_object_hash($observer);
$this->observers[$id] = $observer;
}
function detach(SplObserver $observer)
{
$id = spl_object_hash($observer);
unset($this->observers[$id]);
}
function notify()
{
foreach ($this->observers as $observer) {
$observer->update($this);
}
}
function save()
{
if (in_array($this->changed, array(\'name\')) {
$this->notify();
}
parent::save();
}
}
class XMLObserver implements SplObserver
{
function update(SplSubject $subject)
{
// code here to update memcached key
}
}
我不确定这对我是否最有意义。根据我到目前为止的情况,为什么我不仅仅基于这些字段是否被更改(例如ѭ4like)来调用静态方法。我并没有真正看到使用观察者有什么好处,但是我可能会以错误的方式进行操作。
有人知道处理此问题的最佳方法吗?
没有找到相关结果
已邀请:
1 个回复
卧沫