深度解析 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.mzph.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;如药物传递…