.NET高级面试指南专题十四【 观察者模式介绍,最常用的设计模式之一】

在这里插入图片描述

简介:

观察者模式(Observer Pattern)是一种行为型设计模式,其目的是定义了一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。

原理:

在观察者模式中,有两种角色:观察者(Observer)和被观察者(Subject)。被观察者维护一个观察者列表,并提供注册和删除观察者的方法。当被观察者的状态发生变化时,它会通知所有注册的观察者,调用它们的更新方法,从而使得观察者可以根据被观察者的状态进行相应的操作。

优点:

  • 松耦合(Loose Coupling):被观察者和观察者之间是松耦合的,它们之间只有一个抽象的依赖关系,不会互相影响。
  • 可扩展性(Scalability):可以动态地添加和删除观察者,而不需要修改被观察者的代码,使得系统更易于扩展和维护。
  • 可重用性(Reusability):观察者模式提供了一种通用的机制,使得被观察者和观察者可以独立变化,可以在不同的场景中被重复使用。

缺点:

  • 过多的通知(Overhead):如果被观察者对象有很多状态需要通知观察者,那么可能会产生大量的通知,导致性能问题。
  • 可能引起循环引用(Circular References):如果观察者和被观察者相互引用,可能会导致内存泄漏或其他问题。
  • 通知的顺序不确定(Ordering Issues):观察者收到通知的顺序可能是不确定的,这可能会导致一些问题,特别是在多线程环境下。

常用场景:
观察者模式常用于以下情况:

  1. 当一个对象的改变需要同时改变其他对象,并且不知道具体有多少对象需要改变时。
  2. 当一个对象的改变需要通知其他对象,但又不希望这些对象是紧密耦合的。

在C#中,观察者模式是一种常见的设计模式,可以在许多地方使用。

  1. 事件处理:C#中的事件(Event)机制本质上就是观察者模式的一种实现。事件的订阅者(Subscriber)注册到事件上,当事件发生时,所有订阅者都会收到通知并执行相应的操作。

  2. GUI编程:在Windows Forms、WPF等GUI编程框架中,观察者模式被广泛应用。例如,当用户与界面进行交互时,界面上的控件(如按钮、文本框等)可以作为被观察者,而事件处理程序则充当观察者,当用户进行操作时,控件会通知事件处理程序执行相应的操作。

  3. 消息通知:在消息队列(Message Queue)或事件总线(Event Bus)等场景中,观察者模式常被用于实现消息的订阅和分发。当消息发布时,所有订阅该消息的对象都会收到通知并执行相应的处理逻辑。

  4. 数据绑定:在C#中,通过数据绑定机制,可以将界面上的控件与数据模型进行绑定,当数据模型发生变化时,界面上的控件会自动更新。这种数据绑定机制本质上也是观察者模式的一种应用。WPF的MVVM原理也是基于此

  5. 多线程编程:在多线程编程中,经常会使用观察者模式来实现异步通知机制。例如,当一个线程完成某项任务时,可以通过观察者模式通知其他线程执行相应的操作。

简单的C#代码示例

using System;// 定义事件发布者
public class EventPublisher
{// 定义事件public event EventHandler<string> MyEvent;// 触发事件的方法public void RaiseEvent(string message){MyEvent?.Invoke(this, message);}
}// 定义事件订阅者
public class EventSubscriber
{private readonly string _name;public EventSubscriber(string name){_name = name;}// 事件处理方法public void HandleEvent(object sender, string message){Console.WriteLine($"{_name} received message: {message}");}
}class Program
{static void Main(string[] args){// 创建事件发布者var publisher = new EventPublisher();// 创建事件订阅者var subscriber1 = new EventSubscriber("Subscriber 1");var subscriber2 = new EventSubscriber("Subscriber 2");// 订阅事件publisher.MyEvent += subscriber1.HandleEvent;publisher.MyEvent += subscriber2.HandleEvent;// 触发事件publisher.RaiseEvent("Hello, world!");// 移除订阅者publisher.MyEvent -= subscriber2.HandleEvent;// 再次触发事件publisher.RaiseEvent("Goodbye!");Console.ReadLine();}
}

其他地方用到的 观察者模式
在前端开发中,Vue.js框架本身就是基于观察者模式设计的,它提供了一种响应式的数据绑定机制,使得视图与数据之间能够保持同步。下面是在Vue.js中使用观察者模式的简单示例:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Vue Observer Example</title><!-- 引入Vue.js --><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body><div id="app"><p>{{ message }}</p><button @click="updateMessage">Update Message</button></div><script>// 创建一个Vue实例var app = new Vue({el: '#app',data: {message: 'Hello, Vue!'},methods: {// 更新数据的方法updateMessage: function() {this.message = 'Hello, Vue.js!';}}});</script>
</body>
</html>

在这个示例中,我们创建了一个Vue实例,并在data选项中定义了一个名为message的数据属性。在HTML模板中,我们通过插值表达式{{ message }}将message数据属性绑定到页面上,当message的值发生变化时,页面上的内容也会相应地更新。通过点击按钮,调用updateMessage方法来更新message的值,这时Vue会自动通知相关的视图进行更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/718305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始搭建web组态

成果展示&#xff1a;by组态[web组态插件] 一、技术选择 目前只有两种选择&#xff0c;canvas和svg Canvas: 是一个基于像素的渲染引擎&#xff0c;使用JavaScript API在画布上绘制图像&#xff0c;它的优点包括&#xff1a; Canvas渲染速度快&#xff0c;适合处理大量图像和…

TIOBE 2024榜单启示:程序员如何把握未来编程趋势与机遇

程序员如何选择职业赛道&#xff1f; 程序员的职业赛道就像是一座迷宫&#xff0c;有前端的美丽花园&#xff0c;后端的黑暗洞穴&#xff0c;还有数据科学的神秘密室。你准备好探索这个充满挑战和机遇的迷宫了吗&#xff1f;快来了解如何选择职业赛道吧&#xff01; 方向一…

CSS中如何解决 1px 问题?

1px 问题指的是&#xff1a;在一些 Retina屏幕 的机型上&#xff0c;移动端页面的 1px 会变得很粗&#xff0c;呈现出不止 1px 的效果。原因很简单——CSS 中的 1px 并不能和移动设备上的 1px 划等号。它们之间的比例关系有一个专门的属性来描述&#xff1a; window.devicePix…

重构笔记系统:Docker Compose在微服务架构中的应用与优化

虽然我的笔记系统的开发是基于微服务的思想&#xff0c;但是在服务的配置和编排上感觉还是不太合理&#xff0c;具体来说&#xff0c;在开发上的配置和在生产上的配置差别太大。现在规模小&#xff0c;后面规模变大&#xff0c;估计这一块会成为系统生长的瓶颈。 因此&#xff…

跨时钟信号处理方法

1. 背景 现在的芯片&#xff08;比如SOC&#xff0c;片上系统&#xff09;集成度和复杂度越来越高&#xff0c;通常一颗芯片上会有许多不同的信号工作在不同的时钟频率下。比如SOC芯片中的CPU通常会工作在一个频率上&#xff0c;总线信号&#xff08;比如DRAM BUS&#xff09;会…

python+Django+Neo4j中医药知识图谱与智能问答平台

文章目录 项目地址基础准备正式运行 项目地址 https://github.com/ZhChessOvO/ZeLanChao_KGQA 基础准备 请确保您的电脑有以下环境&#xff1a;python3&#xff0c;neo4j 在安装目录下进入cmd&#xff0c;输入指令“pip install -r requirement.txt”,安装需要的python库 打…

猫为什么挑食?可以改善、预防猫咪挑食的主食冻干分享

现在的猫咪主人都把自家的小猫当成了心头的宝贝&#xff0c;呵护备至。最令人头疼的就是猫咪挑食不吃猫粮&#xff0c;猫为什么挑食&#xff1f;遇到这类情况怎么办呢&#xff1f;今天&#xff0c;我要分享一个既能确保猫咪不受苦&#xff0c;又能有效改善挑食问题的方法。 一、…

vue api封装

api封装 由于一个项目里api是很多的&#xff0c;随处都在调&#xff0c;如果按照之前的写法&#xff0c;在每个组件中去调api&#xff0c;一旦api有改动&#xff0c;遍地都要去改&#xff0c;所以api应该也要封装一下&#xff0c;将api的调用封装在函数中&#xff0c;将函数集…

C++实现简易版http server

mini服务器简介 mini服务器功能 1.实现了GET和POST方法的HTTP request和HTTP respond的构建和发送&#xff0c;使服务器可以完成基本通信功能。 2.使用了线程池技术&#xff0c;使服务器可以一次接收更多的链接和加快了服务器处理数据的速度。 3.实现了简易的CGI&#xff0…

【MATLAB源码-第155期】基于matlab的OFDM系统多径信道LS,LMMSE,SVD三种估计算法的比较误码率对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM&#xff08;Orthogonal Frequency Division Multiplexing&#xff0c;正交频分复用&#xff09;是一种高效的无线信号传输技术&#xff0c;广泛应用于现代通信系统&#xff0c;如Wi-Fi、LTE和5G。OFDM通过将宽带信道划分…

jmeter 按流量阶梯式压测数据库

当前版本&#xff1a; jmeter 5.6.3mysql 5.7.39 简介 JMeter 通过 BZM - Arrivals Thread Group 来模拟并发到达的用户流量、按时间加压&#xff0c;可以有效地帮助测试人员评估系统在高压力和高并发情况下的性能表现。 文章目录如下 1. 下载插件 2. 界面说明 3. 测试步骤…

云计算 2月26号 (进程管理和常用命令)

一、权限扩展 文件权限管理之&#xff1a; 隐藏权限防止root误删除 文件属性添加与查看 [rootlinux-server ~]# touch file1 file2 file3 1.查看文件属性 [rootlinux-server ~]# lsattr file1 file2 file3 ---------------- file1 ---------------- file2 ---------------- f…

UDP协议和TCP协议详解

文章目录 应用层自定义协议 传输层udp协议TCP协议1.确认应答2.超时重传3.连接管理建立连接, 三次握手断开连接, 四次挥手tcp的状态 4.滑动窗口5.流量控制6.拥塞控制7.延时应答8.携带应答9.面向字节流10.异常情况 应用层 自定义协议 客户端和服务器之间往往要进行交互的是“结构…

Eigen-约简,访问和广播

约简化&#xff0c;访客和广播 一、约简化1. 标准计算2. 布尔约减 二、访问三、部分约简1. 将部分约减与其他业务相结合 四、广播1. 将广播与其他业务相结合 一、约简化 在Eigen中&#xff0c;约简化是一个接受矩阵或数组并返回单个标量值的函数。最常用的约简方法之一是.sum(…

心法利器[108] | 微调与RAG的优缺点分析

心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。 2023年新的文章合集已经发布&#xff0c;获取方式看这里&#xff1a;又添十万字-CS的陋室2023年文章合集来袭&#xff0c;更…

修复通达OA 百度ueditor 文件上传漏动

前些日子&#xff0c;服务器阿里云监控报警&#xff0c;有文件木马文件&#xff0c;因为非常忙&#xff0c;就没及时处理&#xff0c;直接删除了木马文件了事。 谁知&#xff0c;这几天对方又上传了木马文件。好家伙&#xff0c;今天不花点时间修复下&#xff0c;你都传上瘾了…

PHP【swoole】

前言 Swoole官方文档&#xff1a;Swoole 文档 Swoole 使 PHP 开发人员可以编写高性能高并发的 TCP、UDP、Unix Socket、HTTP、 WebSocket 等服务&#xff0c;让 PHP 不再局限于 Web 领域。Swoole4 协程的成熟将 PHP 带入了前所未有的时期&#xff0c; 为性能的提升提供了独一无…

Dynamo初学尝试梳理

学习Dynamo有一段时间了&#xff0c;最近整理了下自己的笔记&#xff0c;分享一些给初学者&#xff0c;做个备忘吧&#xff01;&#xff08;PS&#xff1a;很多资料网上都能搜到&#xff0c;我仅仅是收集整理下笔记&#xff0c;分享给大家&#xff09; 今天先简单介绍下Dynamo…

展厅设计中多媒体的常用技术

1、互动投影 可以大大提高展厅和观众之间的互动体验&#xff0c;使观众不仅可以享受观看&#xff0c;还可以在轻松娱乐的氛围中娱乐的氛围中享受每个展览的背景故事和内涵&#xff0c;使整个参观过程非常轻松愉快。 2、幻影成像 可以全面展示企业产品的生产过程&#xff0c;让观…

STM32 (4) GPIO(1)

1.芯片的引脚分布 2.普通IO引脚的命名规则 3.IO复用 IO引脚身兼数职的现象叫做IO复用&#xff0c;可以使芯片拥有更多的功能&#xff0c;例如&#xff1a; PA9和PA10既可以用于GPIO的引脚&#xff0c;也可以用于串口或定时器的引脚 通用&#xff1a;CPU直接控制IO引脚的输入输…