观察者设计模式是解决对象之间松散耦合以便它们可以一起工作的方案。在PHP中,您可以仅使用两个类就可以轻松实现这一点。
基本上,您有一个主题,它能够通知和更新其状态变化列表中的观察者。
我要解决的问题是如何处理向观察者报告它们正在观察的对象的不同状态的问题。
例如,假设我们有一个文件上传类,我们附加了一个记录类、WebSockets类和一个图像调整大小类。这些正在观察的类都想知道上传过程中的不同事件。
这个文件上传类可能有三个地方需要通知正在监听的类发生了某些事情。
- 上传错误(警报记录类)
- 上传成功(警报WebSockets类)
- 上传成功并且是图像文件(警报图像调整大小类)
一个想法是,我可以在调用时说明正在观察的事件类型:
$this->notifyObservers('upload.error', this);
然而,这意味着我必须为观察者自身添加自定义切换功能,以了解如何处理不同的事件。
function observe($type, $object)
{
if($type === 'upload.error') $this->dosomething();
elseif($type === 'something.else') $this->otherthing();
...etc...
}
我发现这样做很丑陋,因为它开始将观察者与他们观察的类联系起来。
但是,如果我只通知观察者而不传递有关刚刚发生的事件的任何信息,他们必须自己猜测正在发生什么,这意味着需要更多的if()检查。