首页 > 其他分享 >设计模式 17 中介者模式

设计模式 17 中介者模式

时间:2024-09-03 17:55:14浏览次数:14  
标签:string 17 void 模式 中介 设计模式 public User

设计模式 17

  • 创建型模式(5):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
  • 结构型模式(7):适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式
  • 行为型模式(11):责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式

文章目录

中介者模式(Mediator Pattern)

1 定义

中介者模式将系统中多个对象之间复杂的交互和依赖关系抽象为一个中介者对象,各个对象不直接引用彼此,而是通过中介者进行通信。这样做可以减少对象之间的直接依赖,从而使系统更加易于维护和扩展。

2 结构

中介者模式包含以下角色:

  • 中介者接口(Mediator): 定义一个接口用于与各同事对象通信。
  • 具体中介者(ConcreteMediator): 实现中介者接口,协调各同事对象之间的交互。
  • 同事类(Colleague): 每个同事类都知道中介者对象,并且在需要与其他同事通信时,都会通过中介者。

UML 类图

                +---------------------------------------------------+
                |     Mediator                                      |
                +---------------------------------------------------+
                | + Notify(sender: Colleague, event: string): void  |
                +---------------------------------------------------+
                                         ^
                                         |
                +---------------------------------------------------+
                |ConcreteMediator                                   |
                +---------------------------------------------------+
                | + Notify(sender: Colleague, event: string): void  |
                | + RegisterColleague(colleague: Colleague): void   |
                +---------------------------------------------------+


                    +-------------------------------------------+
                    |    Colleague                              |
                    +-------------------------------------------+
                    | + SetMediator(mediator: Mediator): void   |
                    | + Send(event: string): void               |
                    +-------------------------------------------+ 
                         ^                                ^
                         |                                |
+-------------------------------+                  +-------------------------------+
| ColleagueA                    |                  |  ColleagueB                   |
+-------------------------------+                  +-------------------------------+
| + Send(event: string): void   |                  | + Send(event: string): void   |
+-------------------------------+                  +-------------------------------+

3 示例代码

假设我们要实现一个聊天室系统,其中用户可以通过聊天室中介者互相发送消息。

中介者接口

// 中介者接口
public interface IChatMediator
{
    void SendMessage(string message, User user);
    void RegisterUser(User user);
}

具体中介者

// 具体中介者
public class ChatMediator : IChatMediator
{
    private readonly List<User> _users = new List<User>();

    public void RegisterUser(User user)
    {
        _users.Add(user);
    }

    public void SendMessage(string message, User sender)
    {
        foreach (var user in _users)
        {
            // 不要发给自己
            if (user != sender)
            {
                user.Receive(message);
            }
        }
    }
}

同事类

// 同事类
public abstract class User
{
    protected IChatMediator _mediator;
    protected string _name;

    public User(IChatMediator mediator, string name)
    {
        _mediator = mediator;
        _name = name;
    }

    public abstract void Send(string message);
    public abstract void Receive(string message);
}

// 具体同事类
public class ConcreteUser : User
{
    public ConcreteUser(IChatMediator mediator, string name) : base(mediator, name)
    {
    }

    public override void Send(string message)
    {
        Console.WriteLine($"{_name} sends: {message}");
        _mediator.SendMessage(message, this);
    }

    public override void Receive(string message)
    {
        Console.WriteLine($"{_name} receives: {message}");
    }
}

客户端代码

class Program
{
    static void Main(string[] args)
    {
        IChatMediator chatMediator = new ChatMediator();

        User user1 = new ConcreteUser(chatMediator, "User1");
        User user2 = new ConcreteUser(chatMediator, "User2");
        User user3 = new ConcreteUser(chatMediator, "User3");

        chatMediator.RegisterUser(user1);
        chatMediator.RegisterUser(user2);
        chatMediator.RegisterUser(user3);

        user1.Send("Hello, everyone!");
    }
}

运行结果

User1 sends: Hello, everyone!
User2 receives: Hello, everyone!
User3 receives: Hello, everyone!

在这个例子中,ChatMediator 是中介者,负责协调 User 对象之间的通信。用户通过调用中介者的 SendMessage 方法来发送消息,中介者会将消息转发给其他用户。

6 特点

  • 优点:

    • 降低耦合度: 中介者模式减少了对象之间的直接依赖,各个对象不需要知道其他对象的存在,只需要与中介者交互。

    • 增强可维护性: 对象之间的交互逻辑集中在中介者中,使得修改交互逻辑变得更加容易,而无需修改各个对象。

    • 易于扩展: 可以通过增加新的中介者或同事类来扩展系统,而不会影响现有代码。

  • 缺点:

    • 中介者复杂性: 随着系统的复杂度增加,中介者可能变得庞大且复杂,难以维护。

    • 可能引入单点故障: 中介者作为通信的中心,如果中介者失败,整个系统的通信可能会中断。

7 适用场景

  • 复杂的对象交互: 当对象之间存在复杂的交互逻辑且相互依赖时,中介者模式可以简化这些交互。
  • 系统易于扩展: 当需要在系统中添加新的交互对象而不希望影响现有代码时,中介者模式非常合适。
  • 分离系统的职责: 中介者模式可以帮助将不同对象的职责清晰地分离开来,从而减少耦合。

8 总结

中介者模式通过引入中介者对象来协调多个对象之间的交互,减少了对象之间的耦合度,并使系统更具可维护性和可扩展性。尽管中介者模式能够简化对象的交互逻辑,但需要注意中介者对象的复杂性管理,以避免其变得过于庞大。

标签:string,17,void,模式,中介,设计模式,public,User
From: https://blog.csdn.net/szy13323042191/article/details/141820517

相关文章

  • Java中的设计模式:面向对象设计的实用技巧
    Java中的设计模式:面向对象设计的实用技巧大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!设计模式是软件工程中被广泛应用的一系列最佳实践,它们可以帮助解决常见的软件设计问题。在Java中,设计模式尤其重要,因为它们提供了一套标准的方法来创建灵活且可......
  • C++ 设计模式——解释器模式
    目录C++设计模式——解释器模式1.主要组成成分2.逐步构建解释器模式步骤1:定义抽象表达式步骤2:实现终结符表达式步骤3:实现非终结符表达式步骤4:构建语法树步骤5:实现内存管理步骤6:创建上下文和客户端3.解释器模式UML图UML图解析4.解释器模式的优点5.......
  • C++ 设计模式——设计模式总结
    目录C++设计模式——设计模式总结1.面向对象程序设计的几个原则2.设计模式的分类3.设计模式的定义3.1创建型设计模式的定义3.2结构型设计模式的定义3.3行为型设计模式的定义4.重要提示C++设计模式——设计模式总结设计模式是软件设计中常见问题的典型解决......
  • 活动系统开发之采用设计模式与非设计模式的区别-需求整理
    用户需求(活动系统):    1、活动类型:答题、图片展示、签到、抽奖、组团等活动     2、活动介绍:        a、答题活动:                        第一种是签到后,随机抽取10道题,答对8到就可以抽奖;          ......
  • 在Java中23种设计模式,分类以及代码示例
    在Java中23种设计模式,分类以及代码示例在Java中,设计模式可以分为23种,以三个不同的分类进行划分。1.创建型模式(CreationalPatterns):单例模式(Singleton)原型模式(Prototype)工厂方法模式(FactoryMethod)抽象工厂模式(AbstractFactory)建造者模式(Builder)2.结构型模式(Structura......
  • VMware Workstation 17.5.2 Pro for Linux 更新 OEM BIOS 2.7 支持 Windows Server 20
    VMwareWorkstation17.5.2ProforLinux更新OEMBIOS2.7支持WindowsServer2025VMwareWorkstation17.5.2PromacOSUnlocker&OEMBIOS2.7forLinux在Linux上运行macOSSonoma请访问原文链接:https://sysin.org/blog/vmware-workstation-17-unlocker-linux/,查......
  • VMware Workstation 17.5.2 Pro for Windows 更新 OEM BIOS 2.7 支持 Windows Server
    VMwareWorkstation17.5.2ProforWindows更新OEMBIOS2.7支持WindowsServer2025VMwareWorkstation17.5.2PromacOSUnlocker&OEMBIOS2.7forWindows在Windows上运行macOSSonoma请访问原文链接:https://sysin.org/blog/vmware-workstation-17-unlocker-win......
  • 如果我想在Android应用中实现资源的自动管理,除了try-with-resources语句,还有哪些设计
    在Android应用开发中,除了使用try-with-resources语句来实现资源的自动管理,还可以参考以下设计模式和最佳实践:1.**单例模式(Singleton)**:  -对于需要全局访问的资源,如数据库连接或共享的配置对象,可以使用单例模式来确保只有一个实例被创建,并在应用的整个生命周期中复用。2......
  • 中建智地1-8月房山住宅网签29.17亿!房山国贤府成交均价4.2万立区域改善标杆
    来源:中国网中建智地1-8月房山4盘住宅网签844套、成交金额29.17亿元,成为房山住宅网签金额、套数、面积三冠王。其中学府印悦以网签359套、成交金额10.95亿元,荣膺1-8月房山住宅网签金额、套数双冠王。(1-8月房山住宅网签房企排行榜,数据来源:天朗)在刚刚过去的8月,中建智地继续冠领......
  • 设计模式-工厂模式设计与详解
    一、工厂模式概述工厂模式(FactoryPattern)是一种常用的创建型设计模式,其核心目的是实现创建对象的接口和具体的实例化分离,通过建立一个工厂类,对实现了同一接口的一些类进行实例的创建,以增加系统的灵活性和可维护性。当需要大量创建一个类的实例的时候,可以使用工厂模式,即从原生的使......