.Net行为型设计模式之中介者模式(Mediator)

.Net行为型设计模式之中介者模式(Mediator)

中介者模式是一种行为型设计模式,它的目的是减少对象之间的耦合度,增强对象之间的协作性,从而提高整个系统的灵活性和可维护性。

在中介者模式中,对象之间的通信都是通过中介者进行的,而不是直接相互引用。这样一来,系统中的每个对象都只需要跟中介者通信,而不用关心其他对象的存在,使得系统更加松耦合,也更加容易扩展和维护。

笔记内容

本篇笔记将主要介绍中介者模式的基本概念和设计思想,以及如何在 .Net 中使用这种模式。

本篇笔记以下述场景为例:假设现在有一个简单的聊天系统,由多个用户组成,每个用户可以向其他用户发送消息。

基本结构

在中介者模式中,主要包括以下几个角色:

  • Mediator(中介者):它定义了一个接口,声明了各种交互方法,同时它还可以知道所有具体的同事对象,并负责协调相互通信之间的具体实现,以及各个同事类的关系。
  • ConcreteMediator(具体中介者):它是中介者模式的实现者,负责协调具体的同事类之间的通信,通过中介者对各个同事类之间的交互进行统一管理和调度。
  • Colleague(同事类):定义了同事类的共有方法,它们是相互依赖的对象,需要相互通信,但是它们并不知道具体的实现细节,只知道中介者交互的一些通用接口。
  • ConcreteColleague(具体同事类):是实现 Colleague 接口的具体类,它们之间可以相互通信,知道自己的中介者对象,处理自己的行为,同时也需要处理其他同事类发来的请求。

中介者模式示例

在聊天系统中,中介者的角色可以被定义为一个“聊天室”的概念,而同事对象则是指聊天系统中的各个用户。这里将给出一个简单的示例,来说明如何实现一个基于中介者模式的聊天系统。

中介者类

首先,让我们看看如何定义中介者类:

interface IChatRoomMediator
{
    void SendMessage(string message, IUser user);
}

class ChatRoomMediator : IChatRoomMediator
{
    public void SendMessage(string message, IUser user)
    {
        Console.WriteLine($"[{user.Name}] said: {message}");
    }
}

在这里,我们定义了一个名为 IChatRoomMediator 的接口,并且定义了唯一的一个方法 SendMessage。这个方法接收两个参数:消息内容和要发送这条消息的用户。

接下来,我们定义一个具体中介者类 ChatRoomMediator,它实现了 IChatRoomMediator 接口,并实现了 SendMessage 方法,用来将用户发送的消息输出到控制台。

同事类

接下来是同事类。在聊天系统中,每个用户都是同事类的一个实例。这里先定义一个用户接口,然后再具体实现两个用户类:

interface IUser
{
    void SendMessage(string message);
    string Name { get; }
}

class SimpleUser : IUser
{
    private readonly IChatRoomMediator mediator;

    public SimpleUser(IChatRoomMediator mediator, string name)
    {
        this.mediator = mediator;
        Name = name;
    }

    public void SendMessage(string message)
    {
        mediator.SendMessage(message, this);
    }

    public string Name { get; }
}

class VIPUser : IUser
{
    private readonly IChatRoomMediator mediator;

    public VIPUser(IChatRoomMediator mediator, string name)
    {
        this.mediator = mediator;
        Name = name;
    }

    public void SendMessage(string message)
    {
        mediator.SendMessage($"[VIP] {message}", this);
    }

    public string Name { get; }
}

在这里,我们定义了一个 IUser 接口,其中包含了一个 SendMessage 方法和一个只读属性 Name

接下来,我们定义两个具体的用户类 SimpleUserVIPUser,它们实现了 IUser 接口,并且在 SendMessage 方法中调用了中介者对象的 SendMessage 方法,将自己发送的消息传递给中介者。

需要注意的是,VIPUser 类在发送消息时会在消息前面添加一个 “[VIP]” 的标识,这里只是为了演示而添加的。

使用中介者模式

现在,我们就可以使用中介者模式了。我们可以创建一个中介者对象并将它传递给每个用户对象,然后用户对象就可以通过中介者对象来发送和接收消息了。

以下是一个使用中介者模式的示例:

var chatRoom = new ChatRoomMediator();

var user1 = new SimpleUser(chatRoom, "Tom");
var user2 = new SimpleUser(chatRoom, "Jerry");
var user3 = new VIPUser(chatRoom, "Spike");

user1.SendMessage("Hi, Jerry!");
user2.SendMessage("Hi, Tom!");
user3.SendMessage("Hello, everyone!");

在这里,我们定义了一个 ChatRoomMediator 对象,并分别创建了三个用户对象 user1user2user3

接着,我们分别调用了每个用户对象的 SendMessage 方法,来模拟在聊天室中发送消息的过程。

输出结果如下:

[Tom] said: Hi, Jerry!
[Jerry] said: Hi, Tom!
[VIP] Hello, everyone!

从输出结果可以看出,中介者对象成功地将用户发送的消息传递到了目标用户。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.Net行为型设计模式之中介者模式(Mediator) - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • 在NET Core 中获取 CPU 使用率

    在.NET Core中获取CPU使用率是一项重要的任务,它可以帮助您监视应用程序的性能并识别瓶颈。在本攻略中,我们将详细讲解在.NET Core中获取CPU使用率的完整过程,并提供两个示例说明。 步骤一:安装System.Diagnostics.Process NuGet包 要获取CPU使用率,您需要使用System.Diagnostics.Process类…

    C# 2023年5月17日
    00
  • C#词法分析器之正则表达式的使用

    C#词法分析器之正则表达式的使用 前言 C#的正则表达式被广泛应用于文本处理和模式匹配。词法分析器是一个典型的例子,需要解析输入的字符串并将其转换为一个完整的语言结构。本文将介绍C#中正则表达式在词法分析器中的应用,并提供两个示例说明。 正则表达式基础 在开始说明C#中正则表达式在词法分析器中的应用之前,我们先来简单介绍正则表达式的基础知识。正则表达式由一些…

    C# 2023年6月7日
    00
  • ASP.NET Core的日志系统介绍

    ASP.NET Core的日志系统介绍 在本攻略中,我们将详细讲解ASP.NET Core的日志系统,并提供两个示例说明。 日志系统简介 ASP.NET Core的日志系统是一个灵活、可扩展的日志框架,可以记录应用程序的运行状态和错误信息。它支持多种日志提供程序,包括控制台、文件、数据库等,可以根据应用程序的需求进行配置和扩展。 日志系统的使用 在ASP.N…

    C# 2023年5月16日
    00
  • .NET Core下使用Log4Net记录日志的方法步骤

    .NET Core下使用Log4Net记录日志的方法步骤 Log4Net是一个流行的日志记录框架,可以在.NET Core应用程序中使用。本攻略将介绍如何在.NET Core应用程序中使用Log4Net记录日志,并提供两个示例说明。 步骤一:安装Log4Net 在.NET Core应用程序中使用Log4Net,需要先安装Log4Net。可以按照以下步骤操作:…

    C# 2023年5月16日
    00
  • C#线程委托实现原理及方法解析

    C#线程委托实现原理及方法解析 介绍 在 C# 中,线程可以作为一个独立的执行单元来运行,它能够给应用程序带来很多好处。线程的实现原理是在众多操作系统和底层硬件支持下完成的,C# 编程语言自身也提供了一些方法和类来帮助我们创建和操作线程。 其中,线程委托是一种非常常用的方式。它可以将一个方法绑定到一个线程上,当线程被启动时,这个方法就会被调用。本篇攻略将详细…

    C# 2023年6月6日
    00
  • C# TreeNode案例详解

    下面是详细讲解“C# TreeNode案例详解”的完整攻略。 1. 概述 在使用 C# 编写 WinForm 窗体程序时,经常会使用 TreeView 控件来实现树形结构的展示。而 TreeView 控件中的节点则是通过 TreeNode 类来表示的。本文将详细介绍如何使用 C# 中的 TreeNode 类来实现一个简单的树形结构。 2. 创建根节点 要创建…

    C# 2023年6月7日
    00
  • C# GUID ToString的使用总结

    C# GUID ToString的使用总结 什么是GUID GUID (Globally Unique Identifier) 是一个128位数的二进制标识符,通常用于在各种领域标识唯一性。 在C#中,可以使用Guid结构体来表示GUID。Guid结构体包含了许多静态方法和实例方法,其中一种实例方法是ToString。 怎么使用GUID ToString方法…

    C# 2023年6月7日
    00
  • Unity实现汽车前后轮倒车轨迹计算

    Unity实现汽车前后轮倒车轨迹计算攻略 在制作汽车驾驶、停车等游戏时,经常需要计算汽车倒车轨迹。本文介绍如何使用Unity实现汽车倒车轨迹计算的完整攻略。 步骤一:创建汽车模型 首先,需要创建一辆汽车模型,包括车身、车轮等组成部分。可以使用Unity自带的模型,也可以自行创建或引入其他模型。 步骤二:设置车轮转动 将车轮设置为可以旋转,可以通过Animat…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部