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

中介者模式

时间:2024-02-29 13:35:32浏览次数:21  
标签:mediator 对象 模式 User 中介 交互

简介

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

 

标签:mediator,对象,模式,User,中介,交互
From: https://www.cnblogs.com/mchao/p/18043473

相关文章

  • 实战上,通过一段ID 生成器代码,学习如何发现,代码质量的问题(设计模式)
    ID生成器的需求背景介绍ID中文翻译为标识Identifier,这个概念在生活,工作中随处可见,比如身份证、商业条形码、二维码、车牌号、驾照号。聚焦到软件开发中,ID常用来标识一些业务信息的唯一标识,比如订单的单号或者数据库中的唯一主键,比如地址中ID字段(实际上时没有业务含义的,对用......
  • 迭代器模式
    简介迭代器模式是一种行为型设计模式,它用于提供一种顺序访问聚合对象(如列表、集合、数组等)中的元素,而不需要暴露该对象的内部表示。这种模式将迭代操作从聚合对象中分离出来,使得可以在不同的聚合对象上使用相同的迭代逻辑。在迭代器模式中,通常会有两个主要角色:迭代器(Iterator......
  • 解释器模式
    简介解释器模式(InterpreterPattern)是一种行为设计模式,用于定义一种语言的语法,并提供一个解释器来解释该语言中的表达式。这种模式通常用于处理特定类型的问题,例如解释一种特定的语言或表示法。结构解释器模式通常包含以下角色:抽象表达式(AbstractExpression):定义了一个抽象......
  • 命令模式
    简介命令模式是一种行为设计模式,它允许将请求或操作封装为单独的对象。这些请求可以被参数化,队列化,记录日志,以及支持撤销操作。以下是命令模式的几个关键角色:命令(Command):抽象命令接口,定义了执行命令的方法,通常包含一个execute()方法。具体命令(ConcreteCommand):实现......
  • 职责链模式
    简介职责链模式(ChainofResponsibilityPattern)是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理它为止。这种模式允许多个对象都有机会处理请求,避免了发送者和接收者之间的耦合关系。结构Handler(处理者):定义处理请求的接口,并维护一个后继处理......
  • 观察者模式
    importtimeclassObserver:def__init__(self,name)->None:self.name=namedefupdate(self,message):print("name%sreceivedmessage:%s"%(self.name,message))classSubject:def__init__(self)->No......
  • 策略模式
    importtimeclassLocalStrategy:defexecute(self):print("thisisalocal104execute")classSaasStrategy:defexecute(self):print("thisisasaasexecute")classSwitch:def__init__(self,strategy......
  • 23种设计模式 - 单例模式
      饿汉式特点:线程安全,调用效率高,但是不能延时加载publicclassSingletonDemo01{privatestaticSingletonDemo1instance=newSingletonDemo1();privateSingletonDemo1(){}publicstaticSingletonDemo1getInstance(){returninstance;}......
  • DM数据库几种主备模式说明
    前言DM数据库的主备集群主要是由搭建数据守护的方式来实现。DM数据守护(DMDataWatch)的实现原理非常简单:将主库(生产库)产生的Redo日志传输到备库,备库接收并重新应用Redo日志,从而实现备库与主库的数据同步。在此基础下,DM通过一些参数和接口的控制可以实现实时主备、读写分离集群......
  • 针对业务系统如何做需求分析(设计模式)
    对于一个工程师来说,如果要追求长远的发展,你就不能一直只把自己放在执行者的角色中,不能只把一个代码的实现者。你还要有独立负责一个系统的能力,能端到端开发一个完整的系统。这其中包括:前期的需求分析,中器的代码的设计和实现。后期的系统的上线维护等。 前面我们还提到过,大部分......