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