.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.pswp.cn/news/718305.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718305.shtml
英文地址,請注明出處:http://en.pswp.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; 方向一…

linux時間校準(ntpdate)

在Linux中&#xff0c;可以使用ntpdate命令來進行時間校準。 首先&#xff0c;打開終端并輸入以下命令安裝ntpdate工具 yum install ntpdate 然后&#xff0c;運行以下命令來同步系統的時間與網絡上的NTP服務器 ntpdate time.nist.gov 若要設置定期自動更新時間&#xff0c;可…

CSS中如何解決 1px 問題?

1px 問題指的是&#xff1a;在一些 Retina屏幕 的機型上&#xff0c;移動端頁面的 1px 會變得很粗&#xff0c;呈現出不止 1px 的效果。原因很簡單——CSS 中的 1px 并不能和移動設備上的 1px 劃等號。它們之間的比例關系有一個專門的屬性來描述&#xff1a; window.devicePix…

重構筆記系統:Docker Compose在微服務架構中的應用與優化

雖然我的筆記系統的開發是基于微服務的思想&#xff0c;但是在服務的配置和編排上感覺還是不太合理&#xff0c;具體來說&#xff0c;在開發上的配置和在生產上的配置差別太大。現在規模小&#xff0c;后面規模變大&#xff0c;估計這一塊會成為系統生長的瓶頸。 因此&#xff…

【Web】速談FastJson反序列化中BasicDataSource的利用

目錄 關于BCEL BCEL的惡意利用demo FastJson配合BCEL初始化任意類 parse情況下后天精心構造彌補先天之不足 exp 參考文章&#xff1a; BCEL ClassLoader去哪了 Java動態類加載&#xff0c;當FastJson遇到內網 關于BCEL BCEL(Byte Code Engineering Library)的全名是Apa…

跨時鐘信號處理方法

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. 測試步驟…

C#在并發編程使用Frozen來確保線程安全性

在C#中&#xff0c;Frozen方法通常用于通過不可變對象來確保線程安全性。這通常在并發編程中很有用&#xff0c;特別是在共享狀態的多線程環境中。Frozen方法是Caliburn Micro框架中的一個方法&#xff0c;它用于將對象標記為不可變。 當你調用Frozen方法時&#xff0c;它返回…

云計算 2月26號 (進程管理和常用命令)

一、權限擴展 文件權限管理之&#xff1a; 隱藏權限防止root誤刪除 文件屬性添加與查看 [rootlinux-server ~]# touch file1 file2 file3 1.查看文件屬性 [rootlinux-server ~]# lsattr file1 file2 file3 ---------------- file1 ---------------- file2 ---------------- f…

【FAQ】HarmonyOS SDK 閉源開放能力 —Account Kit

1.問題描述 實時驗證和非實時驗證的區別是什么&#xff1f; 解決方案 相同點&#xff1a; “手機號快速驗證”和“實時驗證”都是為了向用戶發起獲取手機號信息的請求。最終目的都是為了獲取到手機號。這兩種獲取方式都需要完成“獲取您的手機號”的Scope權限申請。 區別&…

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;你都傳上癮了…