23种设计模式之【中介者模式】-核心原理与 Java 实践

文章目录

中介者模式(Mediator Pattern)

中介者模式是 23 种设计模式中的一种行为型模式,它的核心思想是通过引入一个中介者对象,封装一系列对象之间的交互关系,使得对象之间无需直接通信,而是通过中介者间接交互,从而降低对象之间的耦合度。

核心原理

  • 中介者(Mediator):
    定义一个接口,用于与各同事对象通信
    协调各个同事对象之间的交互关系
  • 具体中介者(ConcreteMediator):
    实现中介者接口,持有所有同事对象的引用
    具体实现协调同事对象交互的逻辑
  • 同事类(Colleague):
    每个同事对象都知道中介者对象
    当需要与其他同事通信时,通过中介者进行
    当自身状态改变时,通知中介者

中介者模式的核心是 "封装交互",将多对多的复杂关系转化为一对多的简单关系,符合迪米特原则(最少知识原则)。

Java 实践示例

下面以 "聊天室" 为例实现中介者模式:

聊天室(中介者)负责转发用户(同事)发送的消息

用户之间不直接通信,而是通过聊天室间接交流

java 复制代码
package com.example.demo;

import java.util.List;
import java.util.ArrayList;

public class MediatorPattern {
    public static void main(String[] args) {
        // 创建中介者(聊天室)
        ChatRoom chatRoom = new ChatRoom();

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

        // 注册用户到聊天室
        chatRoom.registerUser(user1);
        chatRoom.registerUser(user2);
        chatRoom.registerUser(user3);

        // 发送消息
        user1.send("大家好!");
        System.out.println("---");
        user2.send("张三你好!");
        System.out.println("---");
        user3.send("我是王五,很高兴认识大家!");
    }

    // 同事类(用户)
    public static class User {
        private String name;
        private Mediator mediator; // 持有中介者引用

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

        public String getName() {
            return name;
        }

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

        // 接收消息
        public void receive(String message, String senderName) {
            System.out.println(name + "收到来自" + senderName + "的消息: " + message);
        }
    }

    // 中介者接口
    public interface Mediator {
        // 转发消息
        void sendMessage(String message, User sender);

        // 注册用户
        void registerUser(User user);
    }


    public static class ChatRoom implements Mediator {
        private List<User> users;

        public ChatRoom() {
            this.users = new ArrayList<>();
        }

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

        @Override
        public void sendMessage(String message, User sender) {
            // 遍历所有用户,除了发送者本人,转发消息
            for (User user : users) {
                if (user != sender) {
                    user.receive(message, sender.getName());
                }
            }
        }
    }



}

代码解析

Mediator 接口:定义了中介者的基本行为,包括转发消息和注册用户
ChatRoom 类:具体中介者实现

持有所有用户的引用

实现消息转发逻辑:将消息发送给除发送者之外的所有用户

提供用户注册功能
User 类:同事类

每个用户都持有中介者(聊天室)的引用

发送消息时通过中介者进行,不直接与其他用户交互

提供接收消息的方法

运行结果

bash 复制代码
张三发送消息: 大家好!
李四收到来自张三的消息: 大家好!
王五收到来自张三的消息: 大家好!
---
李四发送消息: 张三你好!
张三收到来自李四的消息: 张三你好!
王五收到来自李四的消息: 张三你好!
---
王五发送消息: 我是王五,很高兴认识大家!
张三收到来自王五的消息: 我是王五,很高兴认识大家!
李四收到来自王五的消息: 我是王五,很高兴认识大家!

应用场景

模块间交互复杂的系统:如电商平台的订单、库存、支付等模块之间的交互

GUI 组件交互:如窗口中的按钮、文本框、列表等组件通过一个中介者协调交互
消息中间件:如 MQ(消息队列)本质上是一种中介者,解耦消息生产者和消费者
分布式系统协调:如 ZooKeeper 作为分布式协调服务,扮演中介者角色

团队协作系统:如项目管理工具中,任务、成员、里程碑等通过系统中介协调

中介者模式的优势

在于减少对象间的直接依赖,使得系统更易于维护和扩展;

缺点是如果设计不当,中介者可能会变得过于复杂,成为 "上帝对象"。因此在使用时需注意控制中介者的职责范围。

相关推荐
怒放吧德德4 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆6 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
心之语歌8 小时前
基于注解+拦截器的API动态路由实现方案
java·后端
华仔啊10 小时前
Stream 代码越写越难看?JDFrame 让 Java 逻辑回归优雅
java·后端
ray_liang10 小时前
用六边形架构与整洁架构对比是伪命题?
java·架构
Ray Liang11 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
Java水解11 小时前
Java 中间件:Dubbo 服务降级(Mock 机制)
java·后端
七月丶14 小时前
别再手动凑 PR 了:这个 AI Skill 会按仓库习惯自动建分支、拆提交、提 PR
人工智能·设计模式·程序员
刀法如飞14 小时前
从程序员到架构师:6大编程范式全解析与实践对比
设计模式·系统架构·编程范式
九狼15 小时前
Flutter + Riverpod +MVI 架构下的现代状态管理
设计模式