PHP设计模式之----观察者模式
目标(Subject):定义一个对象或接口,能够通知其依赖的对象。 观察者(Observer):定义一个接口或抽象类,规定了所有观察者必须实现的操作——执行更新。 具体目标(ConcreteSubject):实现目标接口的具体类,能够维护其自身的状态,并通知所有观察者。 具体观察者(ConcreteObserver):实现观察者接口的具体类,能够接收并处理目标的通知。
发布日期:2025-05-05 00:42:28
浏览次数:2
分类:精选文章
本文共 2037 字,大约阅读时间需要 6 分钟。
观察者模式概述与实现
观察者模式(Observer Pattern)是一种设计模式,旨在实现低耦合、非侵入式的通知与更新机制。它的核心思想是:当一个对象的状态发生改变时,其依赖的对象会自动收到通知,并执行相应的更新操作。
观察者模式的场景
传统的事件处理方式通常是直接在事件代码之后添加更新逻辑。当更新逻辑变得复杂时,代码难以维护。此种耦合方式不仅增加了代码的复杂性,还使得添加新的逻辑处理变得困难。观察者模式通过引入通知机制,解决了这一问题。
观察者模式的角色
观察者模式包含以下角色:
观察者模式的代码实现
1. 抽象观察目标
abstract class Subject { protected $observers = array(); abstract public function addObserver(Observer $observer); abstract public function delObserver(Observer $observer); abstract public function notify(); abstract public function condition($num);} 2. 观察者接口
interface Observer { function update();} 3. 具体观察目标
class ConcreteSubject extends Subject { public function addObserver(Observer $observer) { $this->observers[] = $observer; } public function delObserver(Observer $observer) { $key = array_search($observer, $this->observers); if ($key !== false) { unset($this->observers[$key]); } } public function notify() { foreach ($this->observers as $key => $value) { $value->update(); } } public function condition($num) { if ($num > 100) { $this->notify(); } }} 4. 具体观察者
class ConcreteObserverA implements Observer { public function update() { echo "A报告: 敌军超过一百人了,快撤!"; } public function eat() { echo "A在吃饭"; }}class ConcreteObserverB implements Observer { public function update() { echo "B报告: 敌军超过一百人了,快撤!"; } public function sleep() { echo "B在睡觉"; }} 5. 测试
// 测试代码$a = new ConcreteObserverA();$b = new ConcreteObserverB();$subject = new ConcreteSubject();$subject->addObserver($a);$subject->addObserver($b);$subject->condition(1000);
总结
通过以上代码实现,可以清晰地看到观察者模式的工作原理。具体目标(ConcreteSubject)通过通知方法(notify())将所有观察者的更新操作(update())触发。当目标的状态满足特定条件(condition())时,会自动通知所有关注其的观察者。这一机制使得代码结构更加清晰,实现了低耦合、非侵入式的更新管理。
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2026年05月26日 02时58分17秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PHP 截取字符串乱码的解决方案
2023-02-28
php 接口类与抽象类的实际作用
2023-02-28
PHP 插入排序 -- 折半查找
2023-02-28
PHP 支持8种基本的数据类型
2023-02-28
php 放大镜,放大镜放大图片效果
2023-02-28
php 数据库 表格数据,php数据库到excel表格-php怎么把数据库数据放到表格里
2023-02-28
PHP 数据库连接池实现
2023-02-28
php 数组 区别,PHP中数组的区别
2023-02-28
PHP 数组怎么添加一个元素
2023-02-28
PHP 文件上传
2023-02-28
PHP 文件操作
2023-02-28
php 文字弹幕效果代码,HTML5文字弹幕效果
2023-02-28
php 时间日期函数,获取今天开始时间,结束时间
2023-02-28
PHP 构造函数的重载
2023-02-28
php 标准规范
2023-02-28
PHP 浮点型精度运算相关问题
2023-02-28
php 浮点型计算精度问题
2023-02-28
php 特定时间段统计,jpgraph某个时间段的数据统计
2023-02-28
php 生成csv mac下乱码
2023-02-28
php 生成证书 签名及验签
2023-02-28