PHP观察者模式
封面图
•
2025-10-17
•
PHP
155
0
0
0
PHP 中的**观察者模式(Observer Pattern)**是一种行为设计模式,它定义了对象之间的一对多依赖关系。当一个对象的状态发生变化时,所有依赖于它的对象都会收到通知并自动更新。 --- ## 🧠 一、观察者模式的基本概念 ### 1. **主题(Subject)** - 被观察的对象。 - 维护一个观察者列表。 - 提供注册、移除和通知观察者的接口。 ### 2. **观察者(Observer)** - 对主题状态变化感兴趣的类。 - 实现更新方法(如 `update()`)。 ### 3. **具体主题(Concrete Subject)** - 实际被观察的对象,通常继承自 `Subject`。 - 在状态改变时通知所有观察者。 ### 4. **具体观察者(Concrete Observer)** - 具体实现 `Observer` 接口的类。 - 根据主题的变化做出响应。 --- ## 🧩 二、PHP 实现观察者模式示例 ```php <?php // 1. 定义观察者接口 interface Observer { public function update($data); } // 2. 定义主题接口 interface Subject { public function attach(Observer $observer); public function detach(Observer $observer); public function notify(); } // 3. 具体主题(被观察的对象) class ConcreteSubject implements Subject { private $observers = []; private $state; public function getState() { return $this->state; } public function setState($state) { $this->state = $state; $this->notify(); } public function attach(Observer $observer) { $this->observers[] = $observer; } public function detach(Observer $observer) { $key = array_search($observer, $this->observers); if ($key !== false) { unset($this->observers[$key]); } } public function notify() { foreach ($this->observers as $observer) { $observer->update($this->state); } } } // 4. 具体观察者 class ConcreteObserverA implements Observer { public function update($data) { echo "ConcreteObserverA: 收到数据更新:$data\n"; } } class ConcreteObserverB implements Observer { public function update($data) { echo "ConcreteObserverB: 收到数据更新:$data\n"; } } // 5. 使用示例 $subject = new ConcreteSubject(); $observerA = new ConcreteObserverA(); $observerB = new ConcreteObserverB(); $subject->attach($observerA); $subject->attach($observerB); $subject->setState("第一次状态更新"); $subject->setState("第二次状态更新"); // 可以移除观察者 $subject->detach($observerA); $subject->setState("第三次状态更新"); ``` --- ## ✅ 三、输出结果 ``` ConcreteObserverA: 收到数据更新:第一次状态更新 ConcreteObserverB: 收到数据更新:第一次状态更新 ConcreteObserverA: 收到数据更新:第二次状态更新 ConcreteObserverB: 收到数据更新:第二次状态更新 ConcreteObserverB: 收到数据更新:第三次状态更新 ``` --- ## 📌 四、应用场景 - **事件驱动系统**(如用户登录后通知多个模块) - **消息推送系统** - **UI 界面更新**(如表单数据变化时刷新视图) - **日志记录系统** --- ## 🧠 五、优点 - 松耦合:主题与观察者之间没有直接依赖关系。 - 易于扩展:可以随时添加或删除观察者。 - 符合“开闭原则”:对修改关闭,对扩展开放。 --- ## ⚠️ 六、注意事项 - 避免在 `notify()` 中执行耗时操作,否则会影响性能。 - 注意循环引用问题(比如观察者又去修改主题状态,导致无限循环)。 --- 如果你有具体的业务场景,我可以帮你进一步定制观察者模式的实现!需要吗?
上一篇:
PHP SPL 观察者模式
下一篇:
PHP的优化方案
标题录入,一次不能超过6条
返回顶部
留言
留言
评论