【发布时间】:2011-09-16 11:41:47
【问题描述】:
Observer Design Pattern 是松散耦合对象的解决方案,以便它们可以一起工作。在 PHP 中,您只需使用 two classes 即可轻松实现此功能。
基本上,您有一个能够通知和更新观察者列表其状态变化的主题。
我要解决的问题是知道如何处理警告观察者他们正在观看的对象的不同状态。
例如,假设我们有一个文件上传类,我们附加了一个日志记录类、websockets 类和一个图像调整大小类。正在观看的每个班级都想了解上传过程中的不同事件。
这个文件上传类可能有三个地方需要通知监听的类发生了什么事。
- 上传错误(警报日志记录类)
- 上传成功(提醒 websockets 类)
- 上传成功,是图片文件(提醒图片调整大小类)
这是一个非常基本的示例,但是您如何处理不同观察者可能需要了解的多个事件?单独调用 notifyObservers() 是不够的,因为每个观察者都需要知道它收到的通知是什么。
一个想法是我可以通过调用说明正在观察什么类型的事件:
$this->notifyObservers('upload.error', this);
但是,这意味着我必须向观察者本身添加自定义切换,以了解如何处理不同的事件。
function observe($type, $object)
{
if($type === 'upload.error') $this->dosomething();
elseif($type === 'something.else') $this->otherthing();
...etc...
}
我发现这非常丑陋,因为它开始将观察者耦合回他们正在观察的类。
再一次,如果我只是通知观察者而不传递任何关于刚刚发生的事件的信息 - 他们必须自己猜测发生了什么,这意味着更多的 if() 检查。
【问题讨论】:
标签: php observer-pattern