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 作为分布式协调服务,扮演中介者角色

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

中介者模式的优势

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

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

相关推荐
TanYYF6 小时前
Spring MVC 请求执行流程详解
java·spring·mvc
_星辰大海乀6 小时前
初识网络原理
java·网络·协议·tcp协议·osi·ip协议·封装分用
_extraordinary_6 小时前
Java HTTP协议(一)--- HTTP,报文格式,请求和响应
java·开发语言·http
蜚鸣6 小时前
JavaStream用法全解析
java
失散136 小时前
分布式专题——19 Zookeeper分布式一致性协议ZAB源码剖析
java·分布式·zookeeper·云原生·架构
间彧6 小时前
Collections.singletonList详解与应用
java
代码匠心1 天前
从零开始学Flink:数据转换的艺术
java·大数据·flink
泥嚎泥嚎3 天前
【Android】View 的滑动
java
京茶吉鹿3 天前
三步构建完美树节点,从此告别数据结构焦虑!
java·后端