.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数据库连接池

    详解.NET数据库连接池 在.NET应用程序中,数据库连接池是一种重要的技术,它可以提高应用程序的性能和可伸缩性。本攻略将深入讲解.NET数据库连接池的工作原理、配置和最佳实践,并提供两个示例说明。 工作原理 当.NET应用程序需要与数据库进行通信时,它会从连接池中获取一个可用的连接。如果连接池中没有可用的连接,则应用程序将等待,直到有可用的连接为止。当应用…

    C# 2023年5月17日
    00
  • C#加密app.config中连接字符串的方法

    以下是详细讲解“C#加密app.config中连接字符串的方法”的完整攻略: 1. 什么是app.config连接字符串 在使用C#开发应用程序时,可能需要将连接数据库时使用的信息存储在app.config文件中。该文件通常被称为应用程序配置文件,其中包含有关应用程序设置的信息,包括数据库连接字符串、应用程序窗口大小、应用程序特定的设定等。 连接字符串也是应…

    C# 2023年6月7日
    00
  • asp.net中获取客户端IP地址网卡信息等方法的代码

    在ASP.NET中,一般可以通过以下两种方式获取客户端的IP地址。 方法一:通过HttpContext.Current.Request.ServerVariables获取客户端IP地址 string ipAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_F…

    C# 2023年5月31日
    00
  • asp.net页面master页面与ascx用户控件传值的问题

    ASP.NET页面中,Master页面和ASCX用户控件是常见的组件。Master页面通常用于定义网站的整体布局和风格,而ASCX用户控件则用于封装重复使用的控件或作为嵌入其他页面的组件。在一些复杂的应用场景中,我们需要在Master页面和ASCX用户控件之间传递数据或状态,下面是传值的两种方法。 方法一:通过属性(Property)传值 借助于Proper…

    C# 2023年6月3日
    00
  • .NET 中英文混合验证码实现代码

    首先,“.NET 中英文混合验证码实现代码”的完整攻略分为以下几个步骤: 随机获取英文、数字和汉字字符 生成验证码的图片 将验证码图片显示在客户端 对验证码输入进行验证 下面将详细讲解这些步骤,同时给出两个示例说明。 1. 随机获取英文、数字和汉字字符 实现验证码需要随机获取指定长度的英文、数字和汉字字符,下面是获取随机字符的代码示例: string[] c…

    C# 2023年5月31日
    00
  • Visual studio 2017如何发布dotnet core到docker

    在本攻略中,我们将详细讲解如何使用Visual Studio 2017将.NET Core应用程序发布到Docker,并提供两个示例说明。 步骤一:安装Docker for Windows 在使用Visual Studio 2017将.NET Core应用程序发布到Docker之前,您需要安装Docker for Windows。您可以从Docker官网下载…

    C# 2023年5月17日
    00
  • WinForm中变Enter键为Tab键实现焦点转移的方法

    在WinForm程序中,我们常常需要通过键盘快速切换输入框焦点,Enter键和Tab键都是常见的选项,不过默认情况下,Enter键是用来确定输入的,Tab键是用来作为焦点转移的快捷键。如果我们需要调换这两个按键的功能,我们可以进行如下设置。 方法一:使用Input Key预处理消息 在WinForm中,每个控件都有一个ProcessCmdKey方法,该方法可…

    C# 2023年6月7日
    00
  • C#实现顺序表(线性表)完整实例

    C#实现顺序表(线性表)完整实例攻略 什么是顺序表(线性表) 顺序表(线性表)是一种常见的数据结构,由一组连续的存储空间组成,用于实现对数据的快速访问和修改。顺序表(线性表)支持随机访问,可以在O(1)时间内访问任意位置的元素,因此在需要频繁操作数据的场合下被广泛使用。 C#实现顺序表(线性表)的步骤 1. 定义顺序表(线性表) 在C#中,可以使用数组实现顺…

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