深度解析 C# 中介者模式:設計與實戰應用

中介者模式(Mediator Pattern)是一種行為型設計模式,其核心思想是將多個對象之間的交互集中到一個中介者對象中,從而減少對象之間的直接交互,降低耦合度。在實現復雜系統時,中介者模式有助于提高系統的可維護性和擴展性。

在本文中,我們將通過一個簡單的示例來詳細講解如何在C#中實現中介者模式。

1. 中介者模式的概述

中介者模式的核心是引入一個中介者對象,來協調多個同事對象之間的交互。這樣,所有對象的交互都不再是直接的,而是通過中介者來完成。這樣可以減少對象之間的依賴關系,使得系統更易于維護和擴展。

中介者模式的主要角色

  1. Mediator(中介者接口):定義了中介者對象與同事對象的交互接口,聲明了用于與同事對象通信的方法。

  2. ConcreteMediator(具體中介者):實現中介者接口,負責協調具體的同事對象之間的交互邏輯。

  3. Colleague(同事對象接口):每個同事對象都持有對中介者對象的引用,通過中介者與其他同事對象交互。

  4. ConcreteColleague(具體同事類):實現同事接口,執行具體的業務邏輯,并通過中介者與其他同事類交互。

中介者模式的優缺點

優點:
  • 減少耦合:同事對象不再直接通信,而是通過中介者來協調,降低了各對象之間的依賴關系。

  • 集中控制:所有交互邏輯集中在中介者中,便于修改和擴展。

  • 靈活性高:修改交互邏輯時,只需調整中介者的實現,不需要改變同事類的實現。

缺點:
  • 中介者復雜:隨著系統中同事對象的增多,中介者的實現可能變得復雜,難以維護。

  • 單一職責原則被違反:中介者承擔了過多的協調責任,可能會違反單一職責原則,導致中介者的代碼變得臃腫。

2. 中介者模式在C#中的實現

接下來,我們通過一個實際的代碼示例來展示如何在C#中實現中介者模式。

步驟 1:定義中介者接口

首先,我們定義一個IMediator接口,它聲明了一個Send方法,用于發送消息。該方法的參數包括消息內容和發送該消息的同事對象。

public interface IMediator
{void Send(string message, Colleague colleague);
}

步驟 2:實現具體的中介者類

接下來,我們實現一個具體的中介者類ConcreteMediator,它負責協調ColleagueAColleagueB之間的通信。具體的中介者類持有兩個同事對象,并根據需要將消息從一個同事傳遞給另一個同事。

public class ConcreteMediator : IMediator
{private ColleagueA colleagueA;private ColleagueB colleagueB;public ConcreteMediator(ColleagueA colleagueA, ColleagueB colleagueB){this.colleagueA = colleagueA;this.colleagueA.SetMediator(this);this.colleagueB = colleagueB;this.colleagueB.SetMediator(this);}public void Send(string message, Colleague colleague){if (colleague == colleagueA){colleagueB.Notify(message); // 如果消息來自 ColleagueA,則通知 ColleagueB}else{colleagueA.Notify(message); // 如果消息來自 ColleagueB,則通知 ColleagueA}}
}

步驟 3:定義同事類的抽象

我們定義一個抽象的Colleague類,表示所有同事對象。每個同事對象都持有對中介者的引用,并通過中介者與其他同事對象交互。

public abstract class Colleague
{protected IMediator mediator;public void SetMediator(IMediator mediator){this.mediator = mediator;}public abstract void Notify(string message); // 接受來自其他同事的消息
}

步驟 4:實現具體的同事類

我們實現兩個具體的同事類ColleagueAColleagueB,它們繼承自Colleague并實現Notify方法。當同事對象接收到消息時,會通過Notify方法處理消息。

public class ColleagueA : Colleague
{public override void Notify(string message){Console.WriteLine("ColleagueA gets message: " + message);}
}public class ColleagueB : Colleague
{public override void Notify(string message){Console.WriteLine("ColleagueB gets message: " + message);}
}

步驟 5:客戶端代碼

在客戶端代碼中,我們實例化同事對象和中介者對象,并模擬消息的傳遞。ColleagueAColleagueB之間的交互完全通過中介者ConcreteMediator來協調。

class Program
{static void Main(string[] args){// 創建同事對象ColleagueA colleagueA = new ColleagueA();ColleagueB colleagueB = new ColleagueB();// 創建中介者對象并傳入同事對象ConcreteMediator mediator = new ConcreteMediator(colleagueA, colleagueB);// 同事A發送消息colleagueA.Notify("Hello from A");// 同事B發送消息colleagueB.Notify("Hello from B");}
}

運行結果

ColleagueB gets message: Hello from A
ColleagueA gets message: Hello from B

解釋:

  1. ConcreteMediatorConcreteMediator類負責協調ColleagueAColleagueB之間的通信。當其中一個同事發送消息時,ConcreteMediator會將消息轉發給另一個同事。通過這種方式,同事對象之間不再直接依賴于彼此。

  2. ColleagueAColleagueB:這兩個類實現了Colleague接口,并通過Notify方法接收消息。每個同事對象都通過中介者與其他對象進行通信。

3. 中介者模式的優點和應用場景

優點:

  • 減少了對象間的依賴關系:同事對象不再直接依賴于其他對象,而是通過中介者進行通信,從而降低了系統的耦合度。

  • 集中控制:所有的交互邏輯都由中介者控制,修改或擴展交互行為變得更加容易。

  • 更好的維護性和擴展性:如果要添加新的同事對象,只需更新中介者即可,原有的同事對象不需要改動。

應用場景:

  • GUI組件:在圖形用戶界面(GUI)中,按鈕、文本框、標簽等控件常常需要相互配合工作。通過中介者模式,可以將控件之間的交互集中在一個中介者中進行協調。

  • 聊天系統:在一個聊天室中,用戶之間的消息傳遞通常通過服務器進行調度,服務器充當中介者來協調各個用戶之間的消息。

  • 航空系統:航空公司、飛機和機場之間的協調也可以通過一個航空控制中心(中介者)來實現。

4. 總結

中介者模式是一種通過引入中介者來減少對象間直接通信的設計模式。它將多個同事對象的交互集中到一個中介者對象中,從而降低了系統的耦合度。在C#中實現中介者模式時,關鍵是設計一個清晰的中介者接口和具體的中介者類來管理同事對象的交互。中介者模式非常適用于需要減少對象之間緊密耦合的場景,但在同事對象較多時,中介者可能會變得過于復雜,因此需要合理使用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75116.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75116.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75116.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

每日算法-250408

記錄今天解決的兩道 LeetCode 算法題,主要涉及二分查找的應用。 1283. 使結果不超過閾值的最小除數 題目描述 思路 核心思路是 二分查找。 解題過程 為什么可以使用二分? 關鍵在于單調性。對于一個固定的數組 nums,當除數 divisor 增大時&…

MySQL的子查詢

一、前言 MySQL 子查詢是指嵌套在其他 SQL 語句(如 SELECT、WHERE、FROM 等)內部的查詢。用于輔助主查詢完成復雜的數據篩選或計算。 二、子查詢分類 標量子查詢 描述:返回 單行單列(一個值),常用于比較運…

Linux 基礎入門操作 前言 VIM的基本操作 2

1 VIM的背景介紹 Vi 的誕生與1976年,Vim 的前身是 Vi(Visual Editor),由 Bill Joy 在 BSD Unix 系統上開發,作為 ed(行編輯器)的改進版本,提供全屏編輯功能,成為 Unix/L…

Java:Set操作

目錄 Set 轉 List Set 轉 List Set<String>set new HashSet<String>(); set.add("c"); set.add("d"); set.add("a"); set.add("a");//方法一&#xff1a; List<String>list new ArrayList<String>(set);//…

算力驅動未來:從邊緣計算到高階AI的算力革命

算力驅動未來&#xff1a;從邊緣計算到高階AI的算力革命 摘要 本文深入探討了不同算力水平&#xff08;20TOPS至160TOPS&#xff09;在人工智能領域的多樣化應用場景。從邊緣計算的實時目標檢測到自動駕駛的多傳感器融合&#xff0c;從自然語言處理的大模型應用到AI for Scie…

虛擬機上安裝openEuler和openGauss數據庫

1.虛擬機版本選擇VM 16 PRO 2.openEuler版本選擇openEuler-22.03-LTS-SP4-x86_64 下載地址&#xff1a;https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP4/ISO/x86_64/openEuler-22.03-LTS-SP4-x86_64-dvd.iso 3.虛擬機安裝openEuler過程&#xff1a; 4.安裝ope…

0_Pytorch中的張量操作

[引言]張量的概念 1.基本概念 張量是一個通用的多維數組&#xff0c;可以表示標量&#xff08;0 維&#xff09;、向量&#xff08;1 維&#xff09;、矩陣&#xff08;2 維&#xff09;以及更高維度的數據。張量是 PyTorch 中的核心數據結構&#xff0c;用于表示和操作數據。…

LS-LINUX-002 簡易創建SSH

LS-LINUX-002 簡易創建SSH 1. CentOS 8 創建和配置SSH服務 1.1 安裝SSH服務 CentOS 8 默認已經安裝了OpenSSH服務。如果沒有安裝&#xff0c;可以使用以下命令安裝&#xff1a; sudo dnf install -y openssh-server1.2 啟動SSH服務 安裝完成后&#xff0c;需要啟動SSH服務…

計算機專業求職面試的常見題目分類整理

以下是計算機專業求職面試的常見題目分類整理&#xff0c;每個大類精選20道高頻問題&#xff0c;結合參考內容進行解析與擴展&#xff0c;幫助系統化備考&#xff1a; 一、數據結構與算法 解釋時間復雜度和空間復雜度 時間復雜度衡量算法執行時間隨輸入規模的增長趨勢&#xf…

腳本啟動 Java 程序

如果你想在后臺啟動一個 Java 程序&#xff0c;并在終端窗口中顯示一個自定義的名字&#xff0c;可以通過編寫一個簡單的腳本來實現。以下是一個基于 Linux/macOS 的解決方案&#xff0c;使用 Bash 腳本啟動 Java 程序&#xff0c;并在終端窗口中顯示自定義標題。 示例腳本 創建…

CentOS禁用nouveau驅動

1、驗證 nouveau 是否在運行 lsmod | grep nouveau如果命令返回結果&#xff0c;說明 nouveau 驅動正在運行。 2、編輯黑名單文件 通過編輯黑名單配置文件來禁用 nouveau 驅動&#xff0c;這樣在系統啟動時不會加載它。 vi /etc/modprobe.d/blacklist-nouveau.conf修改以下…

Linux: network: tcpdump: packets dropped by kernel

文章目錄 最近遇到一個問題原因libpcap/tcpdump 接口linux/libpcap 接口內核的處理原因可能有以下幾種:解決方法:man pcap_stats最近遇到一個問題 tcpdump命令顯示有dropped的包,而且是被內核drop的。 [root@-one-01 ~]# tcpdump -i any udp and port 8080 -v -w /root/udp…

WEB安全--提權思路

一、情形 在我們成功上傳webshell到服務器中并拿到權限時&#xff0c;發現我們的權限很低無法執行特定的命令&#xff0c;這時為了能做更多的操作&#xff0c;我們就需要提升權限。 二、方式 2.1、Windows提權 1、普通用戶執行systeminfo命令獲取服務器的基本信息&#xff0…

001 vue

https://cn.vuejs.org/ 文章目錄 v-bindv-modelv-on修飾符條件渲染/控制&#xff1a;v-if v-show列表渲染 M&#xff1a;即Model&#xff0c;模型&#xff0c;包括數據和一些基本操作 V&#xff1a;即View&#xff0c;視圖&#xff0c;頁面渲染結果 VM&#xff1a;即View-Mode…

Tomcat 負載均衡

目錄 二、Tomcat Web Server 2.1 Tomcat 部署 2.1.1 Tomcat 介紹 2.1.2 Tomcat 安裝 2.2 Tomcat 服務管理 2.2.1 Tomcat 啟停 2.2.2 目錄說明 2.2.3編輯主頁 2.3 Tomcat管理控制臺 2.3.1開啟遠程管理 2.3.2 配置遠程管理密碼 三、負載均衡 3.1 重新編譯Nginx 3.1.1 確…

使用SpringSecurity下,發生重定向異常

使用SpringSecurity下&#xff0c;發生空轉異常 環境信息&#xff1a; Spring Boot 3.4.4 &#xff0c; jdk 17 &#xff0c; springSecurity 6.4.4 問題背景&#xff1a; 沒有自定義controller &#xff0c;改寫了login 頁面&#xff0c;并且進行了成功后的跳轉處理&#xf…

S130N-ISI 全棧方案與云平臺深度協同:重構 PLC 開發新范式

一、什么是 PLC&#xff1f; 1.技術定義 PLC&#xff08;Power Line Communication&#xff09;是一種創新的通信技術&#xff0c;它以電力線作為天然的傳輸介質&#xff0c;通過先進的信號調制技術將高頻數據信號疊加于工頻電流之上&#xff0c;實現電力輸送與數據通信的雙頻共…

SU-YOLO:基于脈沖神經網絡的高效水下目標檢測模型解析

論文地址:https://arxiv.org/pdf/2503.24389 目錄 一、論文概述 二、創新點解析 1. 基于脈沖的水下圖像去噪(SpikeDenoiser) 原理與結構 2. 分離批歸一化(SeBN) 原理與結構 3. 優化的殘差塊(SU-Block) 原理與結構 三、代碼復現指南 環境配置 模型訓練 四、…

實現阿里云服務器上的文字聊天程序以及C語言寫的進程間通信(IPC)程序

實現阿里云服務器上的文字聊天程序以及C語言寫的進程間通信&#xff08;IPC&#xff09;程序 1. 基于 Linux 中的管道進行進程間通信 我們首先使用管道進行進程間通信&#xff0c;這對于簡單的聊天程序來說是一個比較簡單且實用的方法。 步驟&#xff1a; 創建管道&#xf…

COMSOL 與人工智能融合的多物理場應用:28個案例的思路、方法與工具概述

應用案例概述 基于 COMSOL 與人工智能&#xff08;AI&#xff09;結合的應用案例涵蓋了 28 個多領域場景&#xff0c;包括工程&#xff08;如熱傳導優化、結構力學預測&#xff09;、能源&#xff08;如電池熱管理、燃料電池性能&#xff09;、生物醫學&#xff08;如藥物傳遞…