惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
A
About on SuperTechFans
博客园 - 【当耐特】
Microsoft Security Blog
Microsoft Security Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The GitHub Blog
The GitHub Blog
雷峰网
雷峰网
博客园_首页
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
IT之家
IT之家
博客园 - 叶小钗
Google DeepMind News
Google DeepMind News
aimingoo的专栏
aimingoo的专栏
博客园 - 聂微东
B
Blog RSS Feed
H
Help Net Security
Recent Announcements
Recent Announcements
阮一峰的网络日志
阮一峰的网络日志
D
DataBreaches.Net
L
LangChain Blog
Vercel News
Vercel News

牛牛技术客栈

设计模式-备忘录模式 - OXOXTECH 牛牛技术客栈 Linux【Ubuntu】修改ssh默认端口 - OXOXTECH 牛牛技术客栈 设计模式-迭代器模式 - OXOXTECH 牛牛技术客栈 scheduled定时任务的三种基本实现方式 - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(三) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(二) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(一) - OXOXTECH 牛牛技术客栈 基于JavaFX的桌面端网络调试工具 - OXOXTECH 牛牛技术客栈 Golang Channel的原理介绍 - OXOXTECH 牛牛技术客栈 Go语言Map的原理分析 - OXOXTECH 牛牛技术客栈 Go语言错误处理(panic)的最佳实践 - OXOXTECH 牛牛技术客栈 设计模式-解释器模式 - OXOXTECH 牛牛技术客栈 Redis报错Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. go-webpbin库在Linux报错failed to encode image to WebP: exit status 1.......的问题 exe4j 打包加密的jar - OXOXTECH 牛牛技术客栈 Go生成图形验证码示例 - OXOXTECH 牛牛技术客栈 澳门一天游:一日尽享东方与西方的交融之美 - OXOXTECH 牛牛技术客栈 设计模式-命令模式 - OXOXTECH 牛牛技术客栈 别再自己瞎写工具类了,SpringBoot内置工具类应有尽有 - OXOXTECH 牛牛技术客栈 中山一日游 - OXOXTECH 牛牛技术客栈 设计模式-责任链模式 - OXOXTECH 牛牛技术客栈 起舞吧,齐舞吧 - OXOXTECH 牛牛技术客栈 设计模式-组合模式 - OXOXTECH 牛牛技术客栈 Go语言Web开发|GoFrame框架入门笔记 - OXOXTECH 牛牛技术客栈 Java打包exe教程 - OXOXTECH 牛牛技术客栈 设计模式-代理模式 - OXOXTECH 牛牛技术客栈 MySQL存储过程的优缺点有哪些? - OXOXTECH 牛牛技术客栈 前端渲染优化有哪些? - OXOXTECH 牛牛技术客栈 HTTP状态码及其含义 - OXOXTECH 牛牛技术客栈 从浏览器地址栏输入url到显示页面的步骤 - OXOXTECH 牛牛技术客栈
设计模式-中介者模式 - OXOXTECH 牛牛技术客栈
Jensen · 2026-01-29 · via 牛牛技术客栈

设计模式-中介者模式

Jensen Java Java, 设计模式

前言

Java开发中,设计模式是常用的一种编码方式,合理使用设计模式可以帮助开发人员更快地编写出高效、可靠和可维护的代码。本期将撰写一个关于设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源至:Gitee点击跳转。在上一篇《Java设计模式(15)迭代器模式》文章中,我们介绍了迭代器模式。本文是这个系列的第十六篇章,我们将讲解一下中介者模式的实现方式、应用场景以及它的用途。

中介者模式

中介者模式是一种行为设计模式,它通过一个中介者对象来封装一组对象之间的交互,使得这些对象不需要显式地相互引用,从而使它们之间的耦合松散,方便独立地改变它们之间的交互。中介者模式的核心在于通过中介者对象集中管理和控制对象之间的交互,从而简化对象之间的复杂交互关系。

使用场景

  • 当一个对象的改变会导致多个其他对象的连锁反应时,中介者模式可以将这些复杂的交互逻辑集中到一个中介者对象中
  • 在一个系统中,如果对象之间的耦合度过高,修改一个对象会影响到其他多个对象,那么可以使用中介者模式来解耦
  • 如果系统中对象之间的通信非常复杂,中介者模式可以通过引入一个中介者对象来简化这些逻辑

代码实现

以下是一个使用中介者模式的简单示例。我们将创建一个简单的群发系统,包含UserChatMediator

/**
 * 中介者接口
 * @author Jensen
 * @date 2024-07-13
 * */
public interface ChatMediator {
    void sendMessage(String message, User user);
    void addUser(User user);
}

/**
 * ChatMediator具体实现
 * @author Jensen
 * @date 2024-07-13
 * */
public class ChatMediatorImpl implements ChatMediator{
    private final List<User> users;

    public ChatMediatorImpl(List<User> users) {
        this.users = users;
    }


    @Override
    public void sendMessage(String message, User user) {
        for (User u : users){
            // 发给其他用户
            if (u != user)
                u.receive(message);
        }
    }

    @Override
    public void addUser(User user) {
        this.users.add(user);
    }
}


/**
 * 抽象用户类
 * @author Jensen
 * @date 2024-07-13
 * */
public abstract class User {
    protected ChatMediator mediator;
    protected String name;

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

    public abstract void send(String message);
    public abstract void receive(String message);
}

/**
 * 抽象用户具体实现
 * @author Jensen
 * @date 2024-07-13
 * */
public class UserImpl extends User {
    public UserImpl(ChatMediator mediator, String name) {
        super(mediator, name);
    }

    @Override
    public void send(String message) {
        mediator.sendMessage(message, this);
    }

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

以上 ChatMediator 定义了发送消息和添加用户的方法。

ChatMediatorImpl 实现了 ChatMediator 接口,管理用户列表并实现消息的发送逻辑。 sendMessage 方法遍历用户列表,将消息发送给所有其他用户。

抽象类 User 包含一个对中介者的引用以及用户的名字。 定义了发送消息和接收消息的抽象方法。

UserImpl 实现了 User 类的发送和接收消息的方法。 send 方法通过中介者发送消息,receive 方法用于接收消息。

测试

System.out.println("------------------------------中介者模式-----------------------------");
ChatMediator chatMediator = new ChatMediatorImpl(new ArrayList<>());

//为此聊天室添加一些用户
User zhangsan = new UserImpl(chatMediator, "张三");
User lisi = new UserImpl(chatMediator, "李四");
User wangwu = new UserImpl(chatMediator, "王五");
User zhaoliu = new UserImpl(chatMediator, "赵六");
chatMediator.addUser(zhangsan);
chatMediator.addUser(lisi);
chatMediator.addUser(wangwu);
chatMediator.addUser(zhaoliu);
//张三发消息
zhangsan.send("大家好,我是张三");

输出结果

------------------------------中介者模式-----------------------------
李四 收到消息: 大家好,我是张三
王五 收到消息: 大家好,我是张三
赵六 收到消息: 大家好,我是张三

结语

中介者模式广泛应用于各种需要简化对象之间复杂交互的场景,如 GUI 组件交互、聊天系统、MVC模型和视图之间的通信和控制都可以通过中介者来实现等等。