中介者模式

简介

中介者模式(Mediator Pattern)是一种行为型设计模式,旨在减少对象之间的直接通信,通过引入一个中介对象来促进对象之间的松耦合通信。在这种模式中,对象之间不再直接相互引用,而是通过中介者对象来进行通信。

中介者模式通常包含以下几个角色:

  1. 中介者(Mediator):负责定义接口,用于与各个同事对象进行通信。中介者通常包含了各个同事对象的引用,并且能够协调它们之间的交互关系。

  2. 同事对象(Colleague):各个同事对象之间相互独立,它们不直接相互通信,而是通过中介者来进行通信。当一个同事对象的状态发生变化时,它会通知中介者,由中介者来负责与其他同事对象进行交互。

案例

让我们考虑一个简单的聊天程序作为另一个例子。假设我们有一个简单的聊天应用,其中包含用户界面和消息发送功能。在这个例子中,我们可以使用中介者模式来管理用户界面组件之间的通信。

让我们看看如何使用中介者模式来实现这个聊天应用程序的部分功能。

using System;
using System.Collections.Generic;

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

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

    public void AddUser(User user)
    {
        users.Add(user);
    }

    public void SendMessage(User user, string message)
    {
        foreach (var u in users)
        {
            // 不向消息发送者发送消息
            if (u != user)
            {
                u.ReceiveMessage(message);
            }
        }
    }
}

// 用户类
class User
{
    private string name;
    private IChatMediator mediator;

    public User(string name, IChatMediator mediator)
    {
        this.name = name;
        this.mediator = mediator;
    }

    public void SendMessage(string message)
    {
        Console.WriteLine($"{name} sends message: {message}");
        mediator.SendMessage(this, message);
    }

    public void ReceiveMessage(string message)
    {
        Console.WriteLine($"{name} receives message: {message}");
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 创建中介者
        IChatMediator mediator = new ChatMediator();

        // 创建用户并加入聊天室
        User alice = new User("Alice", mediator);
        User bob = new User("Bob", mediator);
        User charlie = new User("Charlie", mediator);
        mediator.AddUser(alice);
        mediator.AddUser(bob);
        mediator.AddUser(charlie);

        // 用户发送消息
        alice.SendMessage("Hello, everyone!");
        bob.SendMessage("Hi, Alice!");
    }
}

其他案例

  1. 交通管理系统: 在一个城市的交通管理系统中,可能有多种交通工具如汽车、公交车、地铁等在不同的道路上行驶。中介者模式可以用于管理这些交通工具之间的通信和协调。交通管理中心充当中介者的角色,负责监控交通状况,并向交通工具发送指令,以避免交通拥堵或事故发生。

  2. 机场航班调度系统: 在一个机场的航班调度系统中,可能有多个航班在同一时刻需要起飞或降落。中介者模式可以用于协调这些航班之间的起飞和降落时间,以避免航班之间的冲突。航班调度中心充当中介者的角色,负责调度各个航班的起飞和降落时间,并向飞行员发送指令。

  3. 家庭智能系统: 在一个家庭智能系统中,可能有多种智能设备如智能灯泡、智能插座、智能门锁等需要相互通信和协调。中介者模式可以用于管理这些智能设备之间的通信。智能家居中心充当中介者的角色,负责接收用户的指令并将其传达给相应的智能设备,以实现家庭智能化控制。

优点

  1. 降低了对象之间的耦合性: 中介者模式通过将对象之间的直接通信改为通过中介者进行间接通信,降低了对象之间的耦合度,使得系统更易于维护和扩展。

  2. 集中控制交互逻辑: 中介者模式将对象之间的交互逻辑集中在中介者对象中,使得系统的交互逻辑更加清晰和易于理解,同时也更易于修改和维护。

  3. 减少了子类生成: 中介者模式可以避免将系统中的每一个对象都需要知道其他对象的情况,从而减少了子类的生成,降低了系统的复杂度。

  4. 促进了代码重用: 中介者模式将公共的交互行为封装在中介者对象中,可以被多个对象共享和重用,提高了代码的可重用性。

缺点

  1. 中介者对象可能变得过于庞大: 如果系统中的交互关系非常复杂,中介者对象可能会变得过于庞大,导致难以维护和理解。

  2. 增加了系统的单点故障: 中介者模式将系统中的交互行为集中在中介者对象中,如果中介者对象出现问题,可能会影响整个系统的稳定性。

  3. 可能导致性能问题: 中介者模式可能会导致系统的性能下降,因为所有的交互都需要经过中介者对象,可能会引入额外的开销。

  4. 过度使用会导致混乱: 如果过度使用中介者模式,将所有的对象交互都放在中介者对象中,可能会导致系统的结构变得混乱,不利于系统的维护和理解。

应用场景

  1. 多个对象之间存在复杂的交互关系: 当系统中的对象之间存在复杂的交互关系,而且彼此之间的通信会导致耦合度增加时,可以考虑使用中介者模式。中介者模式可以将对象之间的交互逻辑集中在一个中介者对象中,降低对象之间的耦合度。

  2. 系统中的对象之间存在循环依赖关系: 当系统中的对象之间存在循环依赖关系时,可能会导致对象之间的交互复杂化。中介者模式可以通过引入一个中介者对象来解决循环依赖问题,从而简化对象之间的交互。

  3. 系统中的对象之间存在大量的交互: 当系统中的对象之间存在大量的交互,而且这些交互关系比较复杂时,可以考虑使用中介者模式。中介者模式可以将系统中的交互逻辑集中在一个中介者对象中,从而简化系统的设计和实现。

  4. 需要实现对象之间的松耦合: 当系统需要实现对象之间的松耦合时,可以考虑使用中介者模式。中介者模式可以降低对象之间的直接依赖关系,从而实现对象之间的松耦合。

  5. 系统中的对象通信方式多样: 当系统中的对象之间的通信方式比较多样化时,可以考虑使用中介者模式。中介者模式可以将不同对象之间的通信方式统一起来,从而简化系统的设计和实现。

 

posted @ 2024-02-29 13:21  咸鱼翻身?  阅读(10)  评论(0编辑  收藏  举报