试图找到一个这样的例子,我可能没有正确地绕过它,或者我的思想过度简化了观察者模式的概念。
我想创建一个控制来自Web服务的消息的类,我希望这个类监视许多其他操作的更改。
我见过的观察者模式示例表明许多观察者正在观察单个观察者,我可以(或者我应该)反过来这样做吗?我还应该做什么?
答案 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函数/方法。