【发布时间】:2011-06-17 07:11:04
【问题描述】:
试图找到一个这样的例子,可能是我没有走正确的路,或者我的头脑过度简化了观察者模式的概念。
我想创建一个类来控制来自 Web 服务的消息,并且我希望这个类可以监视许多其他操作的变化。
我看到的观察者模式示例展示了许多观察者在观察单个可观察对象,我可以(或应该)反过来做吗?我还应该做什么?
【问题讨论】:
标签: php oop design-patterns observer-pattern
试图找到一个这样的例子,可能是我没有走正确的路,或者我的头脑过度简化了观察者模式的概念。
我想创建一个类来控制来自 Web 服务的消息,并且我希望这个类可以监视许多其他操作的变化。
我看到的观察者模式示例展示了许多观察者在观察单个可观察对象,我可以(或应该)反过来做吗?我还应该做什么?
【问题讨论】:
标签: php oop design-patterns observer-pattern
只需在多个 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 的多个实现不会有问题吗?
我认为记住设计模式是建议而不是绝对的,这一点非常重要。如果可以修改它们以更好地满足您的需求,那么它们应该。
是的,在这种情况下,它绝对可以做到。你的观察者只需要注册一个以上的可观察对象。
当您的一个可观察对象通知它的观察者时,它会简单地循环引用列表以告诉他们更新。这些引用是否与其他可观察对象共享并不重要。
【讨论】:
update() 方法包含不同observables 的多个实现不会有问题吗?
来自 GoF(观察者模式的实现部分),“观察多个主题。在某些情况下,观察者依赖多个主题可能是有意义的。例如,电子表格可能依赖多个数据源,在这种情况下需要扩展Update接口,让观察者知道是哪个主体在发送通知。主体可以简单地将自己作为参数传递给Update操作,从而让观察者知道要检查哪个主题。”
来自 Mchl 的答案已经包含该示例。我只是添加了来自 GoF 的参考,如果您需要这样做,这不是一个坏习惯。
【讨论】:
update() 方法包含不同observables 的多个实现不会有问题吗?
我赞同 1 个班级执行 1 个核心任务的想法。如果是我,我会构建一个观察者接口,创建多个观察者实现,并使用一些 ObserverManager 类管理所有这些观察者。
这样做可以将您的所有业务关注点分开,并提供更精细的测试粒度。
除非“许多其他操作的变化”可以被典型化为同一种可观察到的“变化”。在这一点上,单一的观察者是有意义的。
【讨论】: