《揭秘观察者模式:作用与使用场景全解析》

embedded/2024/11/14 3:31:34/

在软件开发的世界中,设计模式就像是建筑师手中的蓝图,指导着软件系统的构建。其中,观察者模式是一种极为重要且广泛应用的设计模式。今天,我们就来深入探讨一下观察者模式的作用和使用场景。

一、观察者模式是什么?

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象的状态发生变化时,会通知所有依赖它的观察者对象,使它们能够自动更新自己。简单来说,就像是报纸的订阅,报社是主题,读者是观察者,当有新报纸(主题状态改变)时,报社就会通知所有订阅的读者(观察者)。

二、观察者模式的作用

(一)解耦主体与观察者

在传统的紧耦合系统中,如果一个对象的状态变化需要通知其他多个对象,那么它需要直接调用这些对象的方法。这会导致代码的高度耦合,一旦有新的对象需要接收通知或者原有的对象发生变化,就需要修改主体的代码。而观察者模式通过将主体和观察者分离,主体只需要维护一个观察者列表并在状态改变时通知它们,无需关心观察者的具体实现。观察者也只需要关注自己感兴趣的主题,而不用了解主题内部的状态管理。这种解耦使得系统更加灵活和易于维护。

(二)增强可扩展性

当系统需要增加新的观察者时,只需将新的观察者对象注册到主题中即可。例如,在一个股票交易系统中,如果有新的投资者希望关注某只股票的价格变化,只需将这个新投资者作为观察者添加到股票价格这个主题的观察者列表中。同样,减少观察者也很方便,不会对主题和其他观察者造成太大影响。这种可扩展性对于不断发展和变化的软件系统来说至关重要。

(三)支持动态更新

主题对象的状态可以在运行时动态改变,并且所有相关的观察者都会及时得到通知并更新。这使得系统能够实时响应变化,保持数据的一致性。比如在一个实时天气预报系统中,当气象数据(主题状态)更新时,所有显示天气信息的界面(观察者)都能立刻更新显示内容,为用户提供最新的信息。

(四)提高复用性

观察者模式中的观察者和主题都可以被复用。同一个观察者可以同时观察多个主题,只要这些主题遵循相同的通知机制。例如,一个数据可视化组件可以作为观察者同时观察多个数据源主题,根据不同主题的数据变化展示不同的可视化效果。而主题也可以被多个不同的观察者所关注,不同的观察者可以根据自身需求对主题状态变化做出不同的反应。

三、观察者模式的使用场景

(一)图形用户界面(GUI)开发

在 GUI 系统中,用户界面元素之间存在大量的交互。比如,一个按钮被点击(主题状态改变),可能会影响到多个相关的界面组件,如弹出菜单、改变文本框内容等。这些相关的组件可以看作是观察者,按钮则是主题。当按钮状态发生变化时(如按下、释放),通知所有相关的观察者组件做出相应的反应,实现了界面的动态更新和交互。

(二)消息推送系统

在现代的移动应用和网络应用中,消息推送是很常见的功能。消息服务器作为主题,当有新的消息产生时,它需要将消息推送给所有订阅的用户设备(观察者)。每个用户设备都可以根据自己的设置(如是否静音、显示方式等)来处理收到的消息。这种基于观察者模式的设计可以轻松地实现大规模的消息推送,并且能够方便地管理用户的订阅和取消订阅操作。

(三)股票市场监测

在金融领域的股票交易系统中,投资者需要实时关注股票价格的变化。每只股票的价格可以看作是一个主题,而投资者的交易终端或者分析软件就是观察者。当股票价格发生波动时,价格信息会及时通知到所有关注这只股票的投资者,投资者可以根据价格变化做出买入、卖出或者继续持有等决策。

(四)社交网络

在社交网络平台上,当一个用户发布了新的动态(主题状态改变),关注这个用户的其他用户(观察者)会收到通知,然后可以在自己的信息流中看到这条新动态。此外,社交网络中的各种事件,如点赞、评论等也可以通过观察者模式来实现。例如,当一个用户对某条动态进行点赞时,这个动态的点赞数会更新(主题状态变化),同时关注这条动态的其他用户也能看到点赞数的变化。

(五)游戏开发

在游戏中,观察者模式也有广泛的应用。比如,游戏角色的状态(如生命值、攻击力等)变化可以作为主题,游戏界面上显示角色信息的部分(如血条、属性面板等)就是观察者。当角色状态改变时,相关的界面信息会即时更新。同时,游戏中的事件系统,如任务完成、触发新剧情等也可以利用观察者模式,通知相关的游戏元素做出响应。

总之,观察者模式以其强大的解耦能力、可扩展性和动态更新支持等优势,在众多不同类型的软件系统中发挥着重要作用。无论是简单的小型应用还是复杂的大型系统,合理运用观察者模式都能使系统更加灵活、易于维护和扩展,为用户提供更好的体验。通过理解它的作用和使用场景,开发人员可以在合适的项目中巧妙地运用这一设计模式,打造出更优质的软件产品。


http://www.ppmy.cn/embedded/136916.html

相关文章

昇思大模型平台打卡体验活动:项目8基于MindSpore实现ChatGLM4聊天机器人

进入大模型平台,只需要运行即可,可以改输入。 ChatGLM4:使用MindSpore进行聊天机器人开发 本文档提供了使用MindSpore和MindNLP部署和推理ChatGLM4聊天机器人模型的详细步骤,帮助用户搭建一个可以与ChatGLM4互动的对话系统。 前…

Qt 项目架构设计

在开发一个 Qt 项目时,合理的文件夹结构和清晰的构建流程是非常重要的。Qt 项目通常需要管理源代码、UI 文件、资源文件、构建脚本等。下面我会给出一个详细的文件夹结构示例,并解释每个部分的作用及如何设计 Makefile 或使用 Qt 的 qmake 来自动化构建过…

【HarmonyOS NEXT】一次开发多端部署(以轮播图、Tab栏、列表为例,配合栅格布局与媒体查询,进行 UI 的一多开发)

关键词:一多、响应式、媒体查询、栅格布局、断点、UI 随着设备形态的逐渐增多,应用界面适配也面临着很大问题,在以往的安卓应用开发过程中,往往需要重新开发一套适用于大屏展示的应用,耗时又耗力,而鸿蒙提供…

int socket(int domain,int type,int protocol);

本文内容产生自智谱清言 头文件&#xff1a; #include <sys/socket.h> int socket(int domain,int type,int protocol); 它是在C语言中使用的一个系统调用函数&#xff0c;用于创建一个新的套接字。套接字是支持TCP/IP协议的网络通信的端点&#xff0c;可以看作是不同…

ubuntu ros 解决建完图后 保存的地图非常小的问题

解决建完图后 保存的地图非常小的问题 在ROS中使用Gmapping等SLAM算法建图后&#xff0c;如果保存的地图非常小&#xff0c;通常是由于建图过程中的分辨率设置不当或地图边界没有覆盖到整个环境导致的。以下是详细的解决方案和具体步骤&#xff1a; 解决方案概述 调整地图分…

阿里云aliyun gradle安装包下载地址

阿里云 查找你要下载的安装包 macports-distfiles-gradle安装包下载_开源镜像站-阿里云 https://mirrors.aliyun.com/macports/distfiles/gradle/gradle-8.9-bin.zip 腾讯 https://mirrors.cloud.tencent.com/gradle/ https://mirrors.cloud.tencent.com/gradle/ https…

win32com库基于wps对Word文档的基础操作

win32com库基于wps对Word文档的基础操作 文章目录 win32com库基于wps对Word文档的基础操作新建/打开文档段落操作(Paragraph)字体设置(Font)图表操作(Shape) 参考链接: WAS API手册 新建/打开文档 import win32com import win32com.client as win32 # 启动WPS进程 word_obj …

LangChain Ollama实战文献检索助手(二)少样本提示FewShotPromptTemplate示例选择器

本期是用样例来提示大模型生成我们想要的答案。即在输入中给定提示的样例&#xff0c;以及提示模板&#xff0c;然后匹配较相关的样例进行文献综述。 创建示例样本FewShotPromptTemplate 这里我用GTP-o1生成了几个回答&#xff0c;作为样本 samples [{"theme": &…