Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 一个观察者能观察到多个观察物吗?_Php_Oop_Design Patterns_Observer Pattern - Fatal编程技术网

Php 一个观察者能观察到多个观察物吗?

Php 一个观察者能观察到多个观察物吗?,php,oop,design-patterns,observer-pattern,Php,Oop,Design Patterns,Observer Pattern,试图找到一个这样的例子,可能是我没有正确地处理它,或者是我的思维过度简化了观察者模式的概念 我想创建一个类来控制来自web服务的消息,我想让这个类监视许多其他操作的更改 我看到的观察者模式示例演示了许多观察者观察单个观察者,我能(或应该)反过来做吗?我还应该做什么?这当然是可行的。您所需要做的就是向oberver函数/方法添加一个指向可观察对象的参数。我认为记住设计模式是建议而不是绝对的非常重要。如果可以对它们进行修改以更好地满足您的需求,那么它们就应该进行修改 是的,在这种情况下,这是完全可以

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

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


我看到的观察者模式示例演示了许多观察者观察单个观察者,我能(或应该)反过来做吗?我还应该做什么?

这当然是可行的。您所需要做的就是向oberver函数/方法添加一个指向可观察对象的参数。

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

是的,在这种情况下,这是完全可以做到的。您的观察者只需注册多个可观察对象即可


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

只需在多个可观察对象实例中注册一个观察者实例即可

您可能希望在可观测更新时将可观测实例传递给观察者,以便观察者知道哪个特定对象更新了它

一个简单的例子:

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();

此外,您可能还需要查找


这是一个非常好的实现:

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

这样做将分离您所有的业务关注点,并为测试提供更高级别的粒度

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

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


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

一个
update()
方法包含不同
可观察的
的多个实现不是一个问题吗?不是在一般情况下。一个
update()不是一个问题吗
方法包含不同的
可观察的
的多个实现是个问题吗?单个
更新()
方法包含不同的
可观察的
的多个实现不是个问题吗?当我正要问你同样的问题时:“单个更新()方法来包含不同观测值的多个实现是否是一个问题?”,我发现您刚刚完美地回答了它。