设计模式篇2——观察者模式:以直播间送礼系统举例
在软件开发中我们经常遇到这样的场景一个动作发生后需要同时触发一系列后续操作。如果你把这些操作全部写死在一个方法里代码就会变成一团乱麻所谓的“面条代码”牵一发而动全身。今天我们通过一个生动的直播间送礼案例来聊聊如何用观察者模式优雅地解决这个问题。1. 场景引入不仅是送礼那么简单假设你正在开发一个直播 App 的核心功能——送礼。 当用户送出一个“火箭”时后台不仅仅是扣钱那么简单通常还需要触发以下一堆子业务粉丝团系统给用户增加粉丝团经验值。抽奖系统判断这次送礼是否触发了抽奖资格。PK系统如果主播正在打 PK需要给 PK 条增加分数。特效系统在公屏上播放炫酷动画。[问题] 糟糕的实现方式紧耦合如果不使用设计模式你的GiftService代码很可能是这样的Java代码实现public void sendGift(User user, Gift gift) { // 1. 核心业务扣费 walletService.deduct(user, gift.getPrice()); // 2. 杂七杂八的子业务硬编码在这里 fanClubService.addExp(user, 10); // 耦合了粉丝团 lotteryService.check(user); // 耦合了抽奖 pkService.addScore(user, gift.getScore()); // 耦合了PK // 如果明天产品经理说要加个“成就系统”你还得来改这行代码 }痛点很明显违反开闭原则每次增加或删除子功能都要修改sendGift核心代码。维护困难GiftService变得臃肿不堪且依赖了太多它不该关心的服务。2. 破局之道观察者模式观察者模式 (Observer Pattern)属于行为型设计模式。通俗定义它定义了一种一对多的依赖关系。当一个对象主题的状态发生改变时所有依赖于它的对象观察者都会得到通知并自动更新。映射到直播间场景我们可以利用观察者模式将“送礼”看作是一个信号其他系统只需要监听这个信号即可。Subject (主题/被观察者)-直播间送礼服务 (GiftService)职责我是大喇叭。我只负责送礼送完之后喊一声“有人送礼啦”至于谁想知道你们自己来我这里登记注册。Observer (观察者)-粉丝团、抽奖、PK系统职责我是听众。我订阅了送礼事件一旦听到喇叭喊我就赶紧干我自己的活。3. 代码实战解耦的艺术让我们重构一下上面的代码。第一步定义观察者接口 (Observer)所有想监听送礼事件的子系统都必须遵守这个标准。Java代码实现// 观察者接口 public interface GiftObserver { void onGiftSent(User user, Gift gift); }第二步实现具体的观察者 (ConcreteObserver)各个子系统实现接口编写自己的逻辑。Java代码实现// 粉丝团观察者 public class FanClubObserver implements GiftObserver { Override public void onGiftSent(User user, Gift gift) { System.out.println(粉丝团增加经验值 10); } } // PK系统观察者 public class PkObserver implements GiftObserver { Override public void onGiftSent(User user, Gift gift) { System.out.println(PK系统PK条增加分数 gift.getScore()); } }第三步改造送礼服务 (Subject)GiftService不再依赖具体的子系统而是维护一个观察者列表。Java代码实现public class GiftSubject { // 1. 维护一个观察者列表花名册 private ListGiftObserver observers new ArrayList(); // 2. 注册方法订阅 public void attach(GiftObserver observer) { observers.add(observer); } // 3. 移除方法取消订阅 public void detach(GiftObserver observer) { observers.remove(observer); } // 4. 通知方法广播 public void notifyObservers(User user, Gift gift) { for (GiftObserver observer : observers) { observer.onGiftSent(user, gift); } } // 核心业务逻辑 public void sendGift(User user, Gift gift) { // 核心逻辑扣费 System.out.println(钱包扣除余额 gift.getPrice()); // 关键点只负责通知不关心具体是谁在听 notifyObservers(user, gift); } }4. 深度解析优缺点与注意事项优点为什么我们要这么做极度解耦GiftService甚至不知道PKObserver的存在。两者只依赖于抽象接口。扩展性强双十一活动来了需要送礼掉落碎片只需新建一个ActivityObserver并注册进去核心代码一行都不用改。符合开闭原则对扩展开放对修改关闭。缺点你需要警惕的坑同步阻塞问题 在 Java 的标准实现中notifyObservers通常是顺序执行的同步。如果FanClubObserver卡顿了 5 秒后面的PkObserver就得等 5 秒用户的界面也会卡住。解决方案对于非关键业务如发通知、加经验建议采用异步处理放入线程池或消息队列。调试困难 由于逻辑是分散的不像面条代码那样一眼能看完调试时可能需要在一个个观察者之间跳跃流程比较隐晦。5. 进阶Spring 中的观察者模式在实际的 Java 开发特别是 Spring Boot中我们通常不需要自己手动写 Subject 和 Observer 接口Spring 已经为我们封装好了事件发布-监听机制这正是观察者模式的成熟落地。定义事件继承ApplicationEvent(比如GiftSentEvent)。发布者 (Subject)使用ApplicationEventPublisher.publishEvent()。监听者 (Observer)在方法上添加EventListener注解。这种方式比手动写 List 维护更加优雅且天然支持解耦。总结观察者模式就像是生活中的订阅报纸。报社Subject只管印报纸并分发它不知道也不关心是张三还是李四在读报纸。当你发现系统中有**“牵一发而动全身”、“一对多联动”**的业务场景时请果断使用观察者模式。它能让你的核心逻辑保持纯净让复杂的业务链路变得井井有条。

相关新闻

如何高效接入日本股市实时数据?StockTV API 对接实战指南

如何高效接入日本股市实时数据?StockTV API 对接实战指南

在全球金融市场中,日本股市(东京证券交易所 TSE)作为亚洲最重要的市场之一,拥有索尼、丰田、任天堂等众多核心资产。对于开发者而言,获取低延迟、高可靠的日本股票实时行情是构建量化系统或行情应用的关键。 本文将详细…

2026/7/9 20:28:09 阅读更多 →
从“小工”到“专家”,我的软件测试修炼之道

从“小工”到“专家”,我的软件测试修炼之道

你好,我是茹炳晟。我从 2002 年开始做软件开发,2005 年时转型成为测试工程师,算起来已经在这个行业摸爬滚打了 16 年。2005 年的时候,软件测试还停留在重复性手工测试的阶段,而且受重视程度远不如软件开发,…

2026/7/3 18:54:46 阅读更多 →
【开题答辩过程】以《基于uni-app的手账记录小程序的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看

【开题答辩过程】以《基于uni-app的手账记录小程序的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看

个人简介 慕婉学姐精通Java、PHP、微信小程序、Python、Golang和安卓开发等语言,擅长开发大数据、深度学习、网站、小程序、安卓应用和算法项目。平时从事项目定制开发、代码讲解、答辩教学和文档编写,也掌握一些降重技巧。感谢大家的持续关注&#xff…

2026/7/3 18:54:46 阅读更多 →

最新新闻

Cadence IC618 动态比较器噪声仿真:PSS+Pnoise 与 Transient Noise 双方法对比

Cadence IC618 动态比较器噪声仿真:PSS+Pnoise 与 Transient Noise 双方法对比

Cadence IC618 动态比较器噪声仿真:PSSPnoise 与 Transient Noise 双方法对比在高速ADC设计中,动态比较器的噪声特性直接影响系统信噪比和有效位数。传统静态比较器的噪声分析方法无法直接应用于受时钟控制的动态结构,工程师常面临PSSPnoise谐…

2026/7/9 20:26:39 阅读更多 →
Web系统GUI设计实战:3种页面结构对比与Axure RP原型设计案例

Web系统GUI设计实战:3种页面结构对比与Axure RP原型设计案例

Web系统GUI设计实战:3种页面结构对比与Axure RP原型设计案例在数字化浪潮席卷各行各业的今天,Web系统的界面设计质量直接影响着用户体验和业务转化效率。一个优秀的GUI设计不仅需要满足功能需求,更要通过科学的页面结构和流畅的交互逻辑降低用…

2026/7/9 20:24:39 阅读更多 →
锂电池主动均衡系统设计与BQ25887应用解析

锂电池主动均衡系统设计与BQ25887应用解析

1. 项目背景与核心需求在锂电池组管理系统中,电池单元之间的电压差异是一个长期存在的技术难题。当多个电芯串联使用时,由于制造工艺、使用环境和老化程度的差异,各单体电池的容量和内阻会逐渐产生偏差。这种不平衡会导致整个电池组的可用容量…

2026/7/9 20:18:33 阅读更多 →
TLE 6208-6 G与PIC24FJ256GA110的直流电机控制方案

TLE 6208-6 G与PIC24FJ256GA110的直流电机控制方案

1. 项目背景与核心器件选型在工业自动化和嵌入式控制领域,直流电机因其结构简单、控制方便等优点被广泛应用。要实现精确的速度和方向控制,需要高性能的驱动芯片与微控制器协同工作。TLE 6208-6 G是英飞凌推出的六通道半桥驱动器,特别适合汽车…

2026/7/9 20:16:33 阅读更多 →
终极变量命名神器:VARBook如何让中文程序员告别命名困扰

终极变量命名神器:VARBook如何让中文程序员告别命名困扰

终极变量命名神器:VARBook如何让中文程序员告别命名困扰 【免费下载链接】varbook 适合中文程序员的变量命名助手,NLP翻译,规范变量命名,定制化变量命名规则 项目地址: https://gitcode.com/gh_mirrors/va/varbook 你是否曾…

2026/7/9 20:16:33 阅读更多 →
学习Python编程4,日期和时间

学习Python编程4,日期和时间

Python提供了内建模块用来以多种格式处理日期与时间。DateTime模块是一个很流行的日期时间对象处理模块,包括时区,时间差,时间算术运算。模块还提供了许多格式选项用来以不同的方式显示日期和时间。此外,Time模块提供的时间值处理…

2026/7/9 20:14:32 阅读更多 →

日新闻

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource 还在为Foobar2000找不到高质…

2026/7/9 0:01:04 阅读更多 →
ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍

ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍

ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍 【免费下载链接】ElegantBook Elegant LaTeX Template for Books 项目地址: https://gitcode.com/gh_mirrors/el/ElegantBook 你是否曾经为学术书籍的封面设计而烦恼?想要一个既专业又美观的封…

2026/7/9 0:03:06 阅读更多 →
如何高效使用pyodbc:企业级数据库连接终极指南

如何高效使用pyodbc:企业级数据库连接终极指南

如何高效使用pyodbc:企业级数据库连接终极指南 【免费下载链接】pyodbc Python ODBC bridge 项目地址: https://gitcode.com/gh_mirrors/py/pyodbc 在当今数据驱动的商业环境中,企业级数据库连接已成为现代应用开发的核心需求。pyodbc作为一款强大…

2026/7/9 0:07:11 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/8 16:59:55 阅读更多 →

月新闻