Php 我应该使用观察者模式吗?
在我的情况下,我认为最适合使用,但我不确定最好的实现方式 假设我有两张桌子Php 我应该使用观察者模式吗?,php,design-patterns,observer-pattern,Php,Design Patterns,Observer Pattern,在我的情况下,我认为最适合使用,但我不确定最好的实现方式 假设我有两张桌子 User id name email ... 这两个类都是从ORM扩展而来的,父类有一个save()方法 我还有一个xml提要,它存储了user的一些列和order的一些列。当第一次访问提要时,它从数据库中提取所需的信息,生成一个xml提要,并将对象存储在memcached中。对提要的任何后续命中都会从memcached中提取 class User extends ORM implements SplS
User
id
name
email
...
这两个类都是从ORM扩展而来的,父类有一个save()方法
我还有一个xml提要,它存储了user的一些列和order的一些列。当第一次访问提要时,它从数据库中提取所需的信息,生成一个xml提要,并将对象存储在memcached中。对提要的任何后续命中都会从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
}
}
我想做的是,如果某些字段以用户或顺序更改,我想更新memcached键。由于我没有存储user中的所有字段,也没有存储order中的所有字段,所以我不希望它发生在任何save()调用中(而且,xml生成脚本有点数据库密集型)
通过阅读有关Observer模式的内容,我认为User/Order对象也将实现SplSubject,并在其构造函数中附加一个XMLObserver。我必须重写save()方法来通知任何附加的观察者。我只会在某些字段发生更改时调用notify。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
}
}
我不确定这对我来说是否最有意义。根据我到目前为止的情况,为什么我不根据这些字段是否发生了更改(类似于XMLFeed::update($key)
)调用一个静态方法呢。我并没有真正看到使用观察者是如何有益的,但我可能走错了方向
根据我们的评论,也许你应该考虑编写一个函数来确定是否应该将更改传播到MyCask,(取决于被改变的字段),而不是使用观测者模式。 由于memcache将是您唯一的订阅者,需要始终订阅,所以我认为您不会从这种模式的好处中受益太多。发件人: 观察者模式允许您改变 独立于受试者和观察者。 您可以重用主题,而无需重用 他们的观察员,反之亦然。信息技术 允许您添加观察员,而无需 修改主题或其他 观察员
还有其他好处,但我认为在您的场景中,您不会从中受益太多。我不确定是否完全理解您的问题,但memcache真的是您唯一的观察者,还是memcache中有多个观察者?是否存在此XML提要的各种实例,或者只有一个实例在其中的字段发生更改时始终需要更新?当前没有设置其他观察者,因此如果我实现了此功能,memcache将是我唯一的观察者。notify()调用中还有一个bug。我需要在save()之后调用notify(),但我无法访问$this->changed,因为它在save()之后会被清除。这个xml提要也只有一个实例需要更新,对于每个用户对象,只有一个观察者应该总是被通知并且总是被订阅,这个模式似乎没有多大价值。是的,我最初认为我应该使用Observer,因为当主题发生变化时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
}
}