当前位置: 首页 > news >正文

23种设计模式-中介者(Mediator)设计模式

中介者设计模式

  • 🚩什么是中介者设计模式?
  • 🚩中介者设计模式的特点
  • 🚩中介者设计模式的结构
  • 🚩中介者设计模式的优缺点
  • 🚩中介者设计模式的Java实现
  • 🚩代码总结
  • 🚩总结

🚩什么是中介者设计模式?

中介者设计模式(Mediator Pattern) 是一种 行为型设计模式,它通过定义一个中介对象来封装一系列对象之间的交互,使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式。

使用场景

  • 当系统中 对象之间存在复杂的网状引用关系,导致系统结构混乱时

  • 当需要 通过一个中间类来封装多个类之间的交互

  • 不希望对象直接相互引用,而是通过中介者进行通信时

  • 适用于 聊天系统GUI组件交互MVC框架 等场景

🚩中介者设计模式的特点

  • 减少对象间直接依赖:对象间不直接通信,而是通过中介者

  • 集中控制交互:所有交互逻辑集中在中介者中

  • 简化对象设计:各个对象只需与中介者交互

  • 降低耦合度:对象间不再相互持有引用

  • 易于扩展:新增同事类只需修改中介者

🚩中介者设计模式的结构

中介者模式主要包含以下部分:

  • Mediator(抽象中介者):定义同事对象到中介者对象的接口

  • ConcreteMediator(具体中介者):实现抽象中介者的接口,协调各同事对象

  • Colleague(抽象同事类):定义同事类的接口,持有中介者引用

  • ConcreteColleague(具体同事类):实现抽象同事类,与其他同事通过中介者通信

图例:

在这里插入图片描述

🚩中介者设计模式的优缺点

✅ 优点

  • 降低耦合度:将网状结构变为星型结构,减少对象间依赖

  • 简化对象协议:用一对多的交互代替多对多的交互

  • 集中控制交互:将交互行为集中在一个中介者对象中

  • 易于扩展:新增同事类只需修改中介者类

  • 符合迪米特法则:减少对象间的直接通信

❌ 缺点

  • 中介者可能变得复杂:随着同事类增多,中介者会变得庞大复杂

  • 过度集中化:中介者承担过多职责可能成为"上帝对象"

  • 性能问题:所有通信都经过中介者可能影响性能

🚩中介者设计模式的Java实现

代码地址:GitHub

  • 创建 Mediator(抽象中介者) 接口
/**
 * @author hanson.huang
 * @version V1.0
 * @InterfaceName Mediator
 * @Description 抽象中介者
 * @date 2025/3/25 19:38
 **/
public interface Mediator {
    void sendMessage(String message, Colleague colleague);
}
  • 创建 Colleague(抽象同事类) 抽象类
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName Colleague
 * @Description 抽象同事类
 * @date 2025/3/25 19:38
 **/
public abstract class Colleague {
    protected Mediator mediator;
}
  • 创建具体同事类

    • Colleague1
    /**
     * @author hanson.huang
     * @version V1.0
     * @ClassName Colleague1
     * @Description 具体同事类1
     * @date 2025/3/25 19:40
     **/
    public class Colleague1 extends Colleague {
    
        public Colleague1(Mediator mediator) {
            this.mediator = mediator;
        }
    
        public void sendMessage(String message) {
            mediator.sendMessage(message, this);
        }
    
        public void Notify(String message) {
            System.out.println("同事1收到消息:" + message);
        }
    }
    
    • Colleague2
    /**
     * @author hanson.huang
     * @version V1.0
     * @ClassName Colleague2
     * @Description 具体同事类2
     * @date 2025/3/25 19:41
     **/
    public class Colleague2 extends Colleague {
    
        public Colleague2(Mediator mediator) {
            this.mediator = mediator;
        }
    
        public void sendMessage(String message) {
            mediator.sendMessage(message, this);
        }
    
        public void Notify(String message) {
            System.out.println("同事2收到消息:" + message);
        }
    }
    
  • 创建 ConcreteMediator(具体中介者)

/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName ConcreteMediator
 * @Description 具体中介者
 * @date 2025/3/25 19:41
 **/
public class ConcreteMediator implements Mediator{

    private Colleague1 colleague1;
    private Colleague2 colleague2;

    public void setColleague1(Colleague1 colleague1) {
        this.colleague1 = colleague1;
    }

    public void setColleague2(Colleague2 colleague2) {
        this.colleague2 = colleague2;
    }

    @Override
    public void sendMessage(String message, Colleague colleague) {
        if (colleague == colleague1) {
            colleague2.Notify(message);
        } else {
            colleague1.Notify(message);
        }
    }
}
  • 测试中介者模式
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName MediatorPattern
 * @Description 测试中介者模式
 * @date 2025/3/25 19:44
 **/
public class MediatorPattern {

    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();
        Colleague1 colleague1 = new Colleague1(mediator);
        Colleague2 colleague2 = new Colleague2(mediator);

        mediator.setColleague1(colleague1);
        mediator.setColleague2(colleague2);

        colleague1.sendMessage("软考加油");
        colleague2.sendMessage("祝大家软考顺利通过!");
    }
}

📌 运行结果

在这里插入图片描述

🚩代码总结

  • Mediator 接口定义中介者的通信协议

  • Colleague 抽象类是所有同事类的基类,持有中介者引用

  • Colleague1Colleague2 是具体同事类,通过中介者通信

  • ConcreteMediator 是具体中介者,协调同事对象间的交互

  • MediatorPattern 客户端创建中介者和同事对象并设置它们的关系

🚩总结

  • 中介者设计模式 通过引入中介者对象来封装对象间的交互

  • 核心是 将网状的对象引用关系变为星型结构,降低对象间耦合

  • 适用于 对象间交互复杂且相互依赖 的场景

✅ Java源码中的应用场景:

  1. Java消息服务(JMS)

    • 消息队列作为中介者协调消息生产者和消费者
  2. MVC框架

    • 控制器(Controller)作为模型(Model)和视图(View)的中介者

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

在这里插入图片描述

相关文章:

  • lua面向对象
  • Couchbase存储引擎Magma和Couchstore
  • 鸿蒙开发之ArkTS联合类型
  • Kafka 4.0 发布:KRaft 替代 Zookeeper、新一代重平衡协议、点对点消息模型、移除旧协议 API
  • Java排序
  • 输出文字的综合使用例子
  • 本地部署仓库管理工具 Gitlab 并实现外部访问
  • 从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.2.2文本生成逻辑:Top-k采样与温度控制
  • 级联FFT(超采样FFT架构)的MATLAB代码及原理
  • 前端技巧第十期JavaScript作用域链
  • 【银河麒麟系统常识】命令:dotnet --list-sdks(列出已安装的 .NET SDK 版本)
  • matlab打开两个工程
  • Redis 基础篇笔记
  • Android系统Launcher启动流程学习(三)Launcher启动流程
  • Windows 10 ARM64平台MFC串口程序开发
  • 前端知识点---事件委托和机制-阻止冒泡机制-阻止默认行为机制(javascript)
  • JavaScript描述Object.create()方法的原理及作用,如何利用它创建一个具有指定原型的对象?
  • java: 无法访问org.springframework.web.bind.annotation.GetMapping
  • 正则表达式-笔记
  • Transformer的理解
  • 清空wordpress多媒体/东莞seo优化团队
  • 网站建设怎么谈/软文写作的技巧
  • 做教案比较好的网站/网址怎么推广
  • 我也来做外国网站购物/网络营销方案设计毕业设计
  • 做网站卖掉/手机网站建设案例
  • 免费俄罗斯网站制作/百度官网优化