我应该使用观察者模式吗?

| 在某种情况下,我认为使用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)来调用静态方法。我并没有真正看到使用观察者有什么好处,但是我可能会以错误的方式进行操作。 有人知道处理此问题的最佳方法吗?     
已邀请:
根据我们的评论,也许您应该考虑编写一个函数来确定是否应将更改传播到内存缓存(取决于更改的字段),而不是使用观察者模式。 由于内存缓存将是您唯一的订阅者,因此需要始终订阅该订阅者,因此我认为您不会从此模式的好处中受益匪浅。来自http://www.research.ibm.com/designpatterns/example.htm:   观察者模式可让您变化   主体和观察者独立。   您可以重用主题,而无需重用   他们的观察者,反之亦然。它   让您添加观察者而无需   修改主题或其他   观察者。 还有其他好处,但我认为您不会从您的情况中受益匪浅。     

要回复问题请先登录注册