设计模式:生活中的观察者模式
想象你在社交媒体上关注(订阅)了一个名人或新闻频道(主题)。一旦他们发布新内容,所有关注者(观察者)都会收到通知。这个过程就很像观察者模式的工作原理。
生活场景类比
- 主题(Subject):社交媒体上的名人或新闻频道,他们发布更新并通知所有关注者。
- 观察者(Observer):关注名人或新闻频道的用户,他们希望得到更新通知。
- 订阅:用户关注名人或新闻频道的行为,相当于观察者注册到主题。
- 通知:当有新内容发布时,社交媒体平台通知所有关注者,这一过程对应于主题状态改变时通知所有观察者。
- 取消订阅:用户取消关注,相当于观察者从主题注销。
设计模式解析
在这个类比中,社交媒体平台的后台系统就像是观察者模式中的框架,它允许用户(观察者)订阅他们感兴趣的内容源(主题)。主题不需要知道谁关注了它们,它们只需要在更新时将消息发送给社交媒体平台,平台则负责将这些更新分发给所有关注者。
代码实现类比
如果我们把这个类比转换成代码,那么可以这样来实现:
// 观察者接口
interface Follower {void update(String message);
}// 社交媒体名人类
class Celebrity {private List<Follower> followers = new ArrayList<>();private String name;public Celebrity(String name) {this.name = name;}public void postNewContent(String content) {System.out.println(name + " posted: " + content);notifyFollowers(content);}public void addFollower(Follower follower) {followers.add(follower);}public void removeFollower(Follower follower) {followers.remove(follower);}private void notifyFollowers(String content) {for (Follower follower : followers) {follower.update(content);}}
}// 具体观察者
class User implements Follower {private String username;public User(String username) {this.username = username;}@Overridepublic void update(String message) {System.out.println(username + " received an update: " + message);}
}// 客户端代码
public class SocialMediaExample {public static void main(String[] args) {Celebrity celebrity = new Celebrity("The Rock");User user1 = new User("Alice");User user2 = new User("Bob");celebrity.addFollower(user1);celebrity.addFollower(user2);celebrity.postNewContent("Excited to share my new movie trailer with you all!");celebrity.removeFollower(user1);celebrity.postNewContent("Launching my new fitness brand soon!");}
}
类比总结
通过社交媒体关注机制的类比,我们可以更深入地理解观察者模式:
- 动态订阅与取消订阅:用户可以随时开始或停止关注,类似于在观察者模式中动态添加和删除观察者。
- 解耦:名人无需知道具体有哪些用户关注他们,只需发布更新即可,这与观察者模式中主题和观察者之间的解耦相对应。
- 广播通知:社交媒体平台负责将更新广播给所有关注者,就像主题在其状态改变时通知所有观察者一样。
观察者模式强调了对象间的动态关系和通信,以及如何将状态的变化通知给一组可能感兴趣的其他对象。
相关文章:
设计模式:生活中的观察者模式
想象你在社交媒体上关注(订阅)了一个名人或新闻频道(主题)。一旦他们发布新内容,所有关注者(观察者)都会收到通知。这个过程就很像观察者模式的工作原理。 生活场景类比 主题(Subj…...
Qt实现Kermit协议(四)
3 实现 3.3 KermitRecvFile 该模块实现了Kermit接收文件功能。 序列图如下: 3.3.1 KermitRecvFile定义 class QSerialPort; class KermitRecvFile : public QObject, public Kermit {Q_OBJECT public:explicit KermitRecvFile(QSerialPort *serial, QObject *…...
苏州金龙助力旅游客运加速蜕变
近日,北京铭悦旅游客运有限公司又迎来一批苏州金龙海格纯电动客车。(以下简称北京铭悦旅游)总经理郭保生在车辆交付时说到,“为迎接强劲复苏的旅游市场,要求旅游客运向绿色客运转型,以及人民对品质生活、美…...
头盔检测 | 基于Caffe-SSD目标检测算法实现的建筑工地头盔检测
项目应用场景 面向建筑工地头盔检测场景,使用深度学习 Caffe SSD 目标检测算法,基于 C 实现。 项目效果 项目细节 > 具体参见项目 README.md (1) 安装 Caffe SSD(2) 执行训练 sh examples/Hardhat/SSD300/train_SSD300.sh (3) 部署算法 项目获取 h…...
Stable diffusion 加载扩展列表报错解决方法
项目场景: 在使用Stable diffusion webui时,使用扩展列表出现错误 问题描述 点击loadfrom后,出现加载扩展列表报错 原因分析: 下载的扩展的时候,都是github 的url,需要科学上网,如果不能科学…...
Git(8)之分支间同步特定提交
Git(8)之分支间同步特定提交 Author:Once Day Date:2024年4月7日 漫漫长路有人对你微笑过嘛… 全系列文章可查看专栏: Git使用记录_Once_day的博客-CSDN博客 文章目录 Git(8)之分支间同步特定提交1. 分支间同步提交2. cherry-pick同步分支间的特定提交…...
万得AI算法工程师一面面试题6道|含解析
节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 今天…...
蓝桥杯23年第十四届省赛-异或和之和|拆位、贡献法
题目链接: 蓝桥杯2023年第十四届省赛真题-异或和之和 - C语言网 (dotcpp.com) 1.异或和之和 - 蓝桥云课 (lanqiao.cn) 参考题解: 蓝桥杯真题讲解:异或和之和 (拆位、贡献法)-CSDN博客 洛谷P9236 [蓝桥杯 2023 省 A]…...
Unity进阶之路(1)回顾与思考
首先呢,博主在这里先反思一下自己这几个月,其实并没有多少进步。 在寒假中,博主几乎是独立编写了一个小程序的完整UI和一个Uniapp的雏形。那段时间是博主生产力最高的时间段。几乎是每天8点起来开始编写代码,晚上一直忙到很晚。 …...
【C语言】——指针八:指针运算笔试题解析
【C语言】——指针八:指针运算笔试题解析 一、题一二、题二三、题三四、题四五、题五六、题六七、题七 一、题一 //程序输出结果是什么 int main() {int a[5] { 1,2,3,4,5 };int* ptr (int*)(&a 1);printf("%d, %d", *(a 1), *(ptr - 1));return…...
JVM字节码与类的加载——class文件结构
文章目录 1、概述1.1、class文件的跨平台性1.2、编译器分类1.3、透过字节码指令看代码细节 2、虚拟机的基石:class文件2.1、字节码指令2.2、解读字节码方式 3、class文件结构3.1、魔数:class文件的标识3.2、class文件版本号3.3、常量池:存放所…...
小程序如何通过公众号发送新订单提醒
当客户在小程序上下单后,公众号会发送订单通知,这可以让管理员及时获知用户下单情况,方便及时处理订单和提供服务。下面是具体介绍如何设置公众号来发送订单服务通知。 方式一:通过采云公众号发送订单通知 此种方式是默认的通知…...
聊聊公众号最让我不爽的两个痛点
本文首发于 Python猫 微信公众号最让我不爽的地方有两个,而且有很多人虽然也不爽,却不知道原因。 本文想聊聊公众号的两个痛点,因为我经常收到私信问这两个问题,本文算是一次集中的回复吧。 第一个不爽的点是公众号会屏蔽外链&…...
【leetCode】2810. 故障键盘
文章目录 [2810. 故障键盘](https://leetcode.cn/problems/faulty-keyboard/)思路一:模拟代码:思路二:双端队列代码: 2810. 故障键盘 思路一:模拟 用StringBuilder来拼贴字符遍历字符串,如果遇到i,对拼贴好…...
xshell7连接ubuntu18.04
🎡导航小助手🎡 1.查看ubuntu IP2.开启openssh-server3.静态IP设置4.Xshell连接 1.查看ubuntu IP 输入下面命令查看IP ifconfig -a可以看到网卡是ens33,IP为192.168.3.180。 2.开启openssh-server 1、执行下句,下载SSH服务 s…...
真正的力量:实力与人际关系的平衡艺术
在当今社会,人们常常在追求个人发展和建立良好人际关系之间寻找平衡。有一种观点认为,“没有实力,就不要对别人好。不然,很容易被定义为讨好。”这句话在一定程度上揭示了实力与人际关系之间的微妙联系。本文将探讨这一观点的深层…...
Acwing.1388 游戏(区间DP对抗思想)
题目 玩家一和玩家二共同玩一个小游戏。 给定一个包含 N个正整数的序列。 由玩家一开始,双方交替行动。 每次行动可以在数列的两端之中任选一个数字将其取走,并给自己增加相应数字的分数。(双初始分都是 0分) 当所有数字都被…...
Numpy数组转换为csv文件
参考:Converting Numpy Array to CSV 在数据分析和处理中,经常会涉及到将数据从一个形式转换为另一个形式的操作。 其中,将Numpy数组转换为csv文件是一种常见的操作,因为csv文件是一种通用的数据存储格式,方便与其他软…...
替代安全指标(Surrogate Safety Measures (SSM) )
替代安全措施(Surrogate Safety Measures (SSM) )用于从数据中寻找接近碰撞,或可能发生(但实际没有发生)的碰撞事件。 SSM的两个合格标准: (1)它应该来自与碰撞直接相关的交通冲突&…...
usb_camera传输视频流编码的问题记录!
前言: 大家好,今天给大家分享的内容是,一个vip课程付费的朋友,在学习过程中遇到了一个usb采集的视频数据流,经过ffmpeg编码,出现了问题: 问题分析: 其实这个问题不难,关键…...
PhysX 5.1入门实战:从Hello World到刚体模拟的完整流程解析
PhysX 5.1入门实战:从Hello World到刚体模拟的完整流程解析 在游戏开发和物理仿真领域,PhysX引擎一直以其强大的性能和易用性著称。作为NVIDIA旗下的物理引擎解决方案,PhysX 5.1版本带来了更多优化和新特性。本文将带您从零开始,通…...
除了Cesium和Mapbox,用three-tile+Three.js打造轻量级WebGIS的完整实践
用three-tileThree.js构建轻量级WebGIS的工程实践指南 在Web三维地图开发领域,Cesium和Mapbox长期占据主导地位,但它们"全家桶"式的架构往往成为灵活定制的桎梏。当项目需要精细控制渲染管线、深度集成业务逻辑或追求极致性能时,开…...
Cobalt项目文件下载异常问题分析与解决方案:快速排查与修复指南
Cobalt项目文件下载异常问题分析与解决方案:快速排查与修复指南 Cobalt是一款高效友好的开源媒体下载工具,支持YouTube、TikTok、Instagram等30多个平台的视频音频下载。在使用过程中,用户可能会遇到各种下载异常问题。本文将详细分析Cobalt…...
OpenClaw可视化监控:百川2-13B-4bits任务执行状态的实时仪表盘搭建
OpenClaw可视化监控:百川2-13B-4bits任务执行状态的实时仪表盘搭建 1. 为什么需要可视化监控? 去年冬天,我部署了一个基于OpenClaw的自动化写作助手,对接本地运行的百川2-13B-4bits模型。最初几周运行良好,直到某天早…...
实战解析:基于防火墙与三层交换机的企业多业务VLAN安全组网
1. 企业多业务VLAN组网的核心价值 对于200-500人规模的中型企业来说,网络架构就像城市的交通系统。当办公区、研发中心、视频监控、服务器集群等业务单元都挤在同一个"马路"上时,网络拥堵和安全风险就会成为日常噩梦。我去年就遇到过一家制造…...
基于策略模式与智能编排的抖音批量下载系统架构设计与实现
基于策略模式与智能编排的抖音批量下载系统架构设计与实现 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在当今内容驱动的互联网时代,抖音平台汇聚了海量的短视频内容。对于内容创作者、研究者…...
(2026年3月26日)免费电话和大家现在经常说的网络虚拟电话有什么共通和区别之处——
(2026年3月26日)免费电话和大家现在经常说的网络虚拟电话有什么共通和区别之处——免费电话(Free phone/Freephone)是一种电话系统,其通话费用由被叫方(通常是企业或组织)支付,主叫方…...
实战对比:Vamana/HNSW/NSG三大图算法在百维向量搜索中的性能差异
百维向量搜索实战:Vamana/HNSW/NSG三大图算法性能横评 在当今数据爆炸的时代,高效处理高维向量搜索已成为推荐系统、图像识别和自然语言处理等领域的核心技术瓶颈。面对百维甚至更高维度的向量数据,传统暴力搜索方法早已力不从心,…...
Windows系统下安装与配置FreeSWITCH完整指南
本文提供在 Windows 系统上安装 FreeSWITCH 的完整步骤,涵盖下载、安装、配置、启动测试,以及可能遇到问题的解决方案,帮助你顺利完成开发环境的搭建。 一、环境准备与下载 1.1 系统要求 项目要求操作系统Windows 7/8/10/11,Wi…...
Qwen3.5-4B-Claude-Opus基础教程:llama.cpp量化参数对精度影响实测
Qwen3.5-4B-Claude-Opus基础教程:llama.cpp量化参数对精度影响实测 1. 模型介绍 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF是基于Qwen3.5-4B的推理蒸馏模型,特别强化了结构化分析、分步骤回答以及代码与逻辑类问题的处理能力。该版本以GGU…...
