.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日

相关文章

  • C# StringBuilder.Remove()方法:

    StringBuilder.Remove() 方法用于删除字符串中的一段指定长度的字符,它返回一个新的 StringBuilder 对象,表示经过删除后的字符串。 使用方法: StringBuilder.Remove(int startIndex, int length); 参数说明: startIndex:开始删除的位置的索引。 length:删除的长度。…

    C# 2023年4月19日
    00
  • C#华氏温度和摄氏温度相互转换的方法

    下面是关于C#华氏温度和摄氏温度相互转换的方法的完整攻略。 一、思路 要实现华氏温度和摄氏温度相互转换,需要明确两者之间的计算公式,常用的公式如下: 摄氏度转华氏度公式:F = C x 1.8 + 32 华氏度转摄氏度公式:C = (F – 32) / 1.8 因此,无论是将摄氏度转换为华氏度,还是将华氏度转换为摄氏度,都可以依据上述公式来实现。在具体的实现…

    C# 2023年5月31日
    00
  • C#基本语法简介

    以下是关于C#基本语法的简介: C#基本语法 数据类型 C#中有许多数据类型,包括整数(int、long)、浮点数(float、double)、字符(char)、布尔值(bool)等等。同时,C#也支持用户自定义数据类型,使用关键字“class”进行定义。 以下是数据类型示例: int age = 18; float price = 9.99f; char …

    C# 2023年5月15日
    00
  • C#中new操作符的工作机制

    在C#中,使用new操作符可以实例化一个对象,即创建一个对象实例。new操作符有以下几个工作机制: 分配内存空间:new操作符会在内存中为对象分配一定的空间。这个空间包括对象的所有成员变量以及对象所继承的基类的成员变量。 调用构造函数:一旦分配了内存空间,在内存中创建了对象,new操作符会调用对象的构造函数,进行对象的初始化。 返回对象引用:在对象被创建并初…

    C# 2023年5月31日
    00
  • C#实现文件操作(复制,移动,删除)的方法详解

    C#实现文件操作(复制、移动、删除)的方法详解 在C#中,我们可以使用System.IO命名空间中的类来进行文件操作,包括复制、移动、删除等操作。本文将详细介绍如何使用C#实现这些文件操作。 复制文件的方法 首先需要引入System.IO命名空间,即在代码中添加以下的引用: using System.IO; 调用File类的Copy()方法进行文件复制操作。…

    C# 2023年5月31日
    00
  • C# 正则表达式进阶

    C# 正则表达式进阶攻略 引言 正则表达式是一种强大的字符匹配工具,可以在文本数据中快速查找、替换满足特定模式的文本。在 C# 中,使用正则表达式可以通过 System.Text.RegularExpressions 命名空间的类实现。本文将详细讲解如何进阶应用 C# 正则表达式,包括贪婪与懒惰匹配、断言、捕获组、回溯引用等。 贪婪与懒惰匹配 正则表达式默认…

    C# 2023年6月3日
    00
  • C#并行编程Task类用法介绍

    标题:C#并行编程Task类用法介绍 什么是Task类? Task类是C#并行编程中最重要的类之一,它可以用来表示一个异步操作或者一组异步操作,并且可以方便地实现并行编程。 如何使用Task类? 使用Task类有以下几个基本步骤: 步骤一:定义异步任务 需要定义一个表示异步任务的委托,例如: Func<int, int> computeDeleg…

    C# 2023年5月15日
    00
  • C# File.ReadAllText(string path):读取指定文件的所有文本内容

    C#的File.ReadAllText(string path)方法用于读取指定文件的所有文本内容,并以字符串形式返回。该方法适用于读取文本文件中的数据,如果尝试读取非文本文件(如二进制图像),则会导致方法执行失败。 方法参数 File.ReadAllText() 方法需要传入表示文件路径的字符串类型参数,指定要读取的文件。 返回值 File.ReadAll…

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