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

(十 九)趣学设计模式 之 中介者模式!

在这里插入图片描述

目录

    • 一、 啥是中介者模式?
    • 二、 为什么要用中介者模式?
    • 三、 中介者模式的实现方式
    • 四、 中介者模式的优缺点
    • 五、 中介者模式的应用场景
    • 六、 总结

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解观察者模式请看: (十 八)趣学设计模式 之 观察者模式!
✨更多请看个人主页: 码熔burning

一、 啥是中介者模式?

想象一下,一个繁忙的机场 ✈️。 飞机之间不能直接通信,而是通过空中交通管制员(中介者)来协调起飞、降落等操作。 中介者模式就像是这个空中交通管制员,它负责协调多个对象之间的交互,避免对象之间直接耦合。

中介者模式,就是用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互 🎁。

简单来说,就是找个“中间人”来协调多个对象之间的关系,避免大家直接“吵架”!

  • 多个对象之间存在复杂的交互关系: 就像多个飞机需要在机场协调起飞、降落 🛬🛫!
  • 对象之间的耦合度很高: 就像飞机之间直接通信,一旦一个飞机出现问题,可能会影响其他飞机 💥!
  • 你需要集中控制对象之间的交互: 就像需要空中交通管制员来统一协调飞机的行为 👮!

二、 为什么要用中介者模式?

用中介者模式,好处多多 👍:

  • 解耦对象之间的关系: 对象之间不需要直接引用,而是通过中介者进行通信 🤝!
  • 简化对象之间的交互: 将复杂的交互逻辑封装到中介者中,使得对象更加简单 💫!
  • 集中控制交互: 可以方便地修改和扩展对象之间的交互逻辑 ⚙️!
  • 提高代码的可维护性和可复用性: 将交互逻辑集中管理,使得代码更加清晰易懂 💡!

三、 中介者模式的实现方式

中介者模式主要包含两个核心概念:

  • 中介者(Mediator): 定义了一个接口,用于与各个同事对象通信。它知道所有的同事对象,并负责协调它们之间的交互 🏠!
  • 同事(Colleague): 定义了一个接口,用于与中介者通信。它不知道其他的同事对象,只知道自己的行为 ⚙️!
// 抽象同事类:用户

public abstract class User {
    protected ChatRoom mediator; // 中介者

    protected String name;

    public User(ChatRoom mediator, String name) {
        this.mediator = mediator;
        this.name = name;
    }

    public abstract void send(String message); // 发送消息

    public abstract void receive(String message); // 接收消息

    public String getName() {
        return name;
    }
}

// 具体同事类:普通用户

public class ConcreteUser extends User {

    public ConcreteUser(ChatRoom mediator, String name) {
        super(mediator, name);
    }

    @Override
    public void send(String message) {
        System.out.println(this.getName() + " 发送消息: " + message);
        mediator.sendMessage(message, this); // 通过中介者发送消息
    }

    @Override
    public void receive(String message) {
        System.out.println(this.getName() + " 接收消息: " + message);
    }
}

// 抽象中介者:聊天室

public interface ChatRoom {
    void sendMessage(String message, User user); // 发送消息
}

// 具体中介者:具体聊天室

public class ConcreteChatRoom implements ChatRoom {

    private List<User> users = new ArrayList<>();

    public void register(User user) {
        users.add(user);
    }

    @Override
    public void sendMessage(String message, User user) {
        for (User u : users) {
            // 不发送给自己
            if (u != user) {
                u.receive(message);
            }
        }
    }
}

// 客户端

public class Client {
    public static void main(String[] args) {
        // 创建聊天室
        ConcreteChatRoom chatRoom = new ConcreteChatRoom();

        // 创建用户
        User user1 = new ConcreteUser(chatRoom, "张三");
        User user2 = new ConcreteUser(chatRoom, "李四");
        User user3 = new ConcreteUser(chatRoom, "王五");

        // 注册用户
        chatRoom.register(user1);
        chatRoom.register(user2);
        chatRoom.register(user3);

        // 用户发送消息
        user1.send("大家好!");
        user2.send("今天天气不错!");
    }
}

代码解释

  • User 类是抽象同事类,定义了 sendreceive 方法,用于发送和接收消息。
  • ConcreteUser 类是具体同事类,实现了 User 类,负责处理用户的具体行为。
  • ChatRoom 接口是抽象中介者,定义了 sendMessage 方法,用于发送消息。
  • ConcreteChatRoom 类是具体中介者,实现了 ChatRoom 接口,负责协调用户之间的消息传递。

输出结果

张三 发送消息: 大家好!
李四 接收消息: 大家好!
王五 接收消息: 大家好!
李四 发送消息: 今天天气不错!
张三 接收消息: 今天天气不错!
王五 接收消息: 今天天气不错!

四、 中介者模式的优缺点

优点:

  • 解耦对象之间的关系 🤝!
  • 简化对象之间的交互 💫!
  • 集中控制交互 ⚙️!
  • 提高代码的可维护性和可复用性 💡!

缺点:

  • 中介者类可能会变得过于复杂,难以维护 😫!
  • 如果中介者出现问题,可能会影响整个系统的运行 🤯!

五、 中介者模式的应用场景

  • 聊天室: 用户之间通过聊天室进行通信 💬!
  • MVC 框架: 控制器作为中介者,协调模型和视图之间的交互 🖼️!
  • 机场空中交通管制: 协调飞机起飞、降落 ✈️!
  • 智能家居系统: 协调各种智能设备之间的交互 🏠!

六、 总结

  • 中介者模式就像“中间人”,协调多个对象之间的关系,避免大家直接“吵架”! 🤝
  • 核心概念包括中介者和同事! 🔑
  • 优点是解耦对象之间的关系、简化对象之间的交互、集中控制交互、提高代码的可维护性和可复用性! 👍
  • 缺点是中介者类可能会变得过于复杂,难以维护、如果中介者出现问题,可能会影响整个系统的运行! 👎
  • 适用于多个对象之间存在复杂的交互关系,并且对象之间的耦合度很高的场景! 🎯

希望这篇文章能让你彻底理解中介者模式! 💯 祝你学习愉快! 😄
看完请看:(二 十)趣学设计模式 之 迭代器模式!

相关文章:

  • Linux IO编程核心要点解析:文件、流与缓冲区实战指南
  • 多空狙击线-新指标-图文教程,多空分界买点以及强弱操盘技术教程,通达信炒股软件指标
  • 从DNS到TCP:DNS解析流程和浏览器输入域名访问流程
  • QKV 注意力机制在Transformer架构中的作用,和卷积在卷积神经网络中的地位,有哪些相似之处?
  • 使用vue3+element plus 的table自制的穿梭框(支持多列数据)
  • 【大厂AI实践】清华:清华古典诗歌自动生成系统“九歌”的算法
  • Linux下安装VS Code
  • HOW - 在Windows浏览器中模拟MacOS的滚动条
  • 栈和队列的模拟实现
  • 从暴力破解到时空最优:LeetCode算法设计核心思维解密
  • Metal学习笔记十:光照基础
  • 【jenkins配置记录】
  • I2C总线详细介绍
  • Kafka 主题 retention.ms 配置修改及深度问题排查指南
  • NAT,代理服务,内网穿透
  • rancher上强制删除处于Removing状态的集群
  • Spring MVC 返回数据
  • 梯度下降与反向传播
  • DeepSeek使用手册分享-附PDF下载连接
  • 人工智能丨ChatGPT 免费开放网络搜索,能否挑战 Google 的搜索霸主地位?
  • 湛江网站制作/百度联盟官网登录入口
  • 新公司董事长致辞做网站/东莞有限公司seo
  • phpweb网站打开很慢/广州seo网站推广优化
  • 晋中市住房与城乡建设厅网站/网络营销和网络推广有什么区别
  • 灰色网站欣赏/360优化大师历史版本
  • 找人开发软件去什么网站/网站建设的基本