【问题标题】:can an observer observe multiple observables?观察者可以观察多个可观察对象吗?
【发布时间】:2011-06-17 07:11:04
【问题描述】:

试图找到一个这样的例子,可能是我没有走正确的路,或者我的头脑过度简化了观察者模式的概念。

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

我看到的观察者模式示例展示了许多观察者在观察单个可观察对象,我可以(或应该)反过来做吗?我还应该做什么?

【问题讨论】:

    标签: php oop design-patterns observer-pattern


    【解决方案1】:

    只需在多个 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

    【讨论】:

    • 单个update() 方法包含不同observables 的多个实现不会有问题吗?
    • 一般情况下没有。
    【解决方案2】:

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

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

    当您的一个可观察对象通知它的观察者时,它会简单地循环引用列表以告诉他们更新。这些引用是否与其他可观察对象共享并不重要。

    【讨论】:

    • 单个update() 方法包含不同observables 的多个实现不会有问题吗?
    【解决方案3】:

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

    来自 Mchl 的答案已经包含该示例。我只是添加了来自 GoF 的参考,如果您需要这样做,这不是一个坏习惯。

    【讨论】:

    • 单个update() 方法包含不同observables 的多个实现不会有问题吗?
    【解决方案4】:

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

    这样做可以将您的所有业务关注点分开,并提供更精细的测试粒度。

    除非“许多其他操作的变化”可以被典型化为同一种可观察到的“变化”。在这一点上,单一的观察者是有意义的。

    【讨论】:

    • 当我要问你同样的问题时:“一个 update() 方法包含不同 observables 的多个实现不是一个问题吗?”,我发现你回答得很好。
    猜你喜欢
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 2019-09-09
    • 1970-01-01
    相关资源
    最近更新 更多