观察者能观察到多个可观测量吗?

时间:2011-01-28 14:44:14

标签: php oop design-patterns observer-pattern

试图找到一个这样的例子,我可能没有正确地绕过它,或者我的思想过度简化了观察者模式的概念。

我想创建一个控制来自Web服务的消息的类,我希望这个类监视许多其他操作的更改。

我见过的观察者模式示例表明许多观察者正在观察单个观察者,我可以(或者我应该)反过来这样做吗?我还应该做什么?

5 个答案:

答案 0 :(得分:4)

只需在许多Oservable实例中注册一个Observer实例。

每当Observable更新时,您可能都希望将Observable实例传递给Observer,以便Observer知道哪个特定对象更新了它。

一个简单的例子:

interface Observer {   
  public update(Observable $observable);
}

class Observable() {
   private $observers = array();

   public function register(Observer $observer) {
     $this->observers[] = $observer;
   }

   public function update() {
     foreach($observers as $observer) {
       $observer->update($this);
     }
   }
}

$observer = new ObserverImplementation();

$observable1->register($observer);
$observable2->register($observer);

$observable1->update();
$observable2->update();

您也可以查找the Mediator pattern

这是非常好的实现:Symfony Event Dispatcher

答案 1 :(得分:3)

我认为记住设计模式是建议而非绝对是非常重要的。如果可以修改它们以更好地满足您的需求,那么它们应该。

是的,在这种情况下,它绝对可以完成。您的观察者只需要注册多个可观察对象。

当你的一个可观察对象将通知它的观察者时,它将简单地循环一个引用列表以告诉它们更新。如果这些引用与其他可观察对象共享,则无关紧要。

答案 2 :(得分:1)

我赞同1类执行1个核心任务的想法。如果是我,我将构建一个观察者接口,创建多个观察者实现,并使用一些ObserverManager类管理所有这些观察者。

这样做会将您的所有业务问题分开,并为测试提供更精细的粒度。

除非“许多其他操作的变化”可以表现为同一种可观察的“变化”。那时单个观察者是有道理的。

答案 3 :(得分:1)

从GoF(Observer模式的实现部分),“观察多个主题。在某些情况下,观察者依赖于多个主题可能是有意义的。例如,电子表格可能依赖于多个数据源。在这种情况下,有必要扩展Update接口,让观察者知道哪个主体正在发送通知。主体可以简单地将自己作为参数传递给Update操作,从而让观察者知道要检查哪个科目。“

Mchl的回答已经包含了这个例子。我只是添加了GoF的参考资料,如果你需要这样做,这将不是一个坏习惯。

答案 4 :(得分:0)

这当然可行。您需要做的就是将参数添加到指向observable的oberver函数/方法。