如何在PHP中实现完整的Observer模式

| 观察者设计模式是松散耦合对象以便它们可以一起工作的解决方案。在PHP中,您只需使用两个类即可轻松实现此目的。 基本上,您有一个主题,可以通知和更新其状态更改的观察者列表。 我要解决的问题是知道如何处理以警告观察者有关他们正在观察的对象的不同状态的处理程序。 例如,假设我们有一个文件上传类,在该类中附加了日志记录类,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()检查。     
已邀请:
        观察者实际上并没有耦合到他们正在观察的类。观察者的处理程序和被观察对象之间的连接是使用文字字符串值(例如“ upload.error \”)建立的,这意味着: 如果要观察特定的对象,则必须事先知道它将发布的事件的名称;这是您不喜欢的“耦合”。 另一方面,如果您只对特定事件感兴趣,则可以在不了解该对象的情况下观察该事件的任何类型的对象。 上面的第2项是您关心的好处,但是对第1项怎么办? 如果考虑一下,如果它们代表发生的不同事件,则需要某种方法来区分对同一观察者的回调。这些“标识符”,无论采用什么形式,都需要打包到观察对象中或作为观察者库代码的一部分。 在第一个实例中(在观察到的对象内部),您可能需要一种让观察者查询“您是否发布过事件X?”的方法,然后才开始观察该事件的目标。目标可以很好地回答这个问题。这给耦合带来了苦涩的味道,但是如果您希望任何物体观察其他物体,并且您不知道事先要观察什么,我认为您无法做得更好。 在第二种方法中,您将在库中定义许多众所周知的事件(在类中为
const
?)。大概可以制作这样一个事件列表,因为该库处理一个具体的应用程序域,并且该域为事件提供了明显的选择。然后,库内部的类(最终将被观察)和库外部的类(插入框架的观察者)都将使用这些标识符来区分事件。许多基于回调的API(例如Win32)使用的方法实际上与此相同。     

要回复问题请先登录注册