《无间道》观察者模式
电影无间道很多人都看过,讲的是关于黑社会与警局卧底的故事。
我们今天就聊一下无间道和面向对象的观察者模式到底有什么关系。
//被观察者 public interface Observable { void notifyEverybody(); //通知所有人 } //曾志伟 扮演的 黑社会老大 韩琛 public class HanLaoda implements Observable { ArrayList<Observer> observerList;//卧底们(除了梁朝伟还有很多卧底,比如陈朝伟、张朝伟) public void notifyEverybody() { for (Observer item : observerList) { item.reportWangSir(); } } //韩老大为了扩充势力,只管招小弟进来,但他不知道招进来的是卧底 public void addObserver(Observer observer) { observerList.add(observer); } //做违法事情 public void doWeifa() { //卧底们一旦发现韩老大要做违法事情,就开始秘密通知警方 notifyEverybody(); } } //观察者 public interface Observer { //卧底 一旦发现有违法交易,立马做出行动。报告给 黄秋生扮演的 王Sir。 void reportWangSir(); } //梁朝伟 扮演的 梁永仁 是警局安插到黑社会的卧底 public class LiangChaowei implements Observer { public void reportWangSir() { //报告给王Sir } } //陈朝伟 public class ChenChaowei implements Observer { public void reportWangSir() { //报告给王Sir } } //张朝伟 public class ZhangChaowei implements Observer { public void reportWangSir() { //报告给王Sir } } public class Client { public static void main() { HanLaoda han = new HanLaoda(); //韩老大为了扩充势力,只管招小弟进来,但他不知道招进来的是卧底 han.addObserver(new LiangChaowei()); han.addObserver(new ChenChaowei()); han.addObserver(new ZhangChaowei()); //做违法事情 han.doWeifa(); } }
那观察者模式在什么情况下使用呢?
观察者可以实现消息的广播,一个消息可以触发多个事件,这是观察者模式非常重要的功能。
使用观察者模式也有个重点问题要解决:
广播链的问题
如果你做过数据库的触发器,你就应该知道有一个触发器链的问题,比如表 A 上写了一个触发器,
内容是一个字段更新后更新表 B 的一条数据,而表 B 上也有个触发器,要更新表 C,表 C 也有触发器…,完蛋了,
这个数据库基本上就毁掉了!我们的观察者模式也是一样的问题,一个观察者可以有双重身份,即使观察者,
也是被观察者,这没什么问题呀,但是链一旦建立,这个逻辑就比较复杂,可维护性非常差,根据经验建议,
在一个观察者模式中多出现一个对象既是观察者也是被观察者,也就是说消息多转发一次(传递两次),这还是比较好控制的。
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· 开发者新选择:用DeepSeek实现Cursor级智能编程的免费方案
· 【译】.NET 升级助手现在支持升级到集中式包管理
· 独立开发经验谈:如何通过 Docker 让潜在客户快速体验你的系统
· Tinyfox 发生重大改版