PHP观察者模式详解:结构、角色及应用实例

0 下载量 65 浏览量 更新于2024-08-30 收藏 72KB PDF 举报
PHP设计模式中的观察者模式(Observer)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都能得到通知并自动更新。这种模式源于GOF95设计模式中的经典概念,也被称作发布-订阅模式、模型-视图模式、源-监听模式或从属者模式。 观察者模式的核心结构包括四个角色: 1. 抽象主题(Subject):作为中心对象,维护一个观察者集合,并提供增加和删除观察者的方法。在PHP中,抽象主题可以由一个具体子类实现,如`ConcreteSubject`。 2. 抽象观察者(Observer):定义一个通用接口,要求观察者在接收到主题变化时调用更新方法。在PHP中,这可能是一个接口或者抽象类。 3. 具体主题(ConcreteSubject):是抽象主题的实现,包含实际的状态并负责触发通知。当状态改变时,会调用所有注册的观察者的更新方法。 4. 具体观察者(ConcretedObserver):是观察者模式的具体实现,存储对特定主题的引用,并实现抽象观察者接口以同步状态。 观察者模式的优势在于它降低了观察者和主题之间的耦合,支持广播通信,即一个主题的变化可以同时通知所有观察者。然而,缺点在于观察者可能无法预见改变的影响范围,可能导致意外的更新。 观察者模式适用于以下场景: - 当对象A的状态改变可能影响对象B、C等多个对象,但A并不清楚有多少对象会受到影响。 - 当对象之间的依赖关系松散,不希望它们过于紧密地绑定在一起。 与其他模式结合时,观察者模式有时会与中介者模式(Mediator)一起使用,中介者模式可以封装复杂的行为更新逻辑,充当主题和观察者之间的协调者。此外,为了确保只有一个可用的ChangeManager对象,可以利用单例模式(Singleton)来管理。 以下是一个简单的PHP观察者模式实现示例: ```php <?php class Subject { private $observers = []; public function attach(Observer $observer) { $this->observers[] = $observer; } public function detach(Observer $observer) { foreach ($this->observers as $key => $item) { if ($item === $observer) { unset($this->observers[$key]); break; } } } public function notify() { foreach ($this->observers as $observer) { $observer->update($this); } } } interface Observer { public function update(Subject $subject); } class ConcreteSubject extends Subject { // 存储状态并实现触发通知 } class ConcreteObserver implements Observer { private $subject; public function __construct(ConcreteSubject $subject) { $this->subject = $subject; } public function update(ConcreteSubject $subject) { // 更新逻辑,例如处理状态变化 } } ``` 在这个例子中,`ConcreteSubject`是具体主题,它有一个观察者数组,并且有`notify`方法来发送更新。`ConcreteObserver`是具体观察者,实现了`Observer`接口,当`ConcreteSubject`的状态改变时,所有注册的观察者都会被调用`update`方法。