2011-01-28 223 views
1

试图找到一个这样的例子,可能是我没有采取正确的方式,或者我的思想过于简化了观察者模式的概念。观察员可以观察多个可观察物吗?

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

我看过的观察者模式示例演示了许多观察者在观察单个可观察的事物,我可以(或者应该)以相反的方式做到这一点吗?我还应该做什么?

回答

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

0

这当然是可行的。所有你需要做的是通过添加一个参数到oberver函数/方法指向可观察。

3

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

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

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

0

我订阅的1类执行1个核心任务的想法。如果是我,我会建立一个观察者接口,创建多个观察者实现,并用一些ObserverManager类来管理所有这些观察者。

这样做会分离您的所有业务问题,并将提供更精细的测试级别。

除非“许多其他操作的变化”可以表示为同一种可观察的“变化”。在这一点上,单一的观察者是有道理的。

1

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

Mchl的答案已经包含了这个例子。我只是在GoF中添加引用,如果您需要这样做,这不会是一个坏习惯。