java23种设计模式-中介者模式

中介者模式(Mediator Pattern)学习笔记


编程相关书籍分享:https://blog.csdn.net/weixin_47763579/article/details/145855793

DeepSeek使用技巧pdf资料分享:https://blog.csdn.net/weixin_47763579/article/details/145884039


1. 模式定义

行为型设计模式,通过定义一个中介对象来封装一系列对象之间的交互。减少对象间的直接耦合,使其可以独立改变交互方式。

2. 适用场景

✅ 对象之间存在复杂的网状引用关系

✅ 需要集中控制多个对象间的交互

✅ 需要限制对象之间的直接通信

✅ 希望复用组件间的交互逻辑

✅ 需要动态改变对象间的交互规则

3. 模式结构

knows interacts-with <<interface>> Mediator +notify(sender: Colleague, event: String) ConcreteMediator -colleagueA: Colleague -colleagueB: Colleague +notify() <<abstract>> Colleague -mediator: Mediator +setMediator() +send() +receive() ConcreteColleagueA +send() +receive() ConcreteColleagueB +send() +receive()

4. 核心角色

角色 说明
Mediator 抽象中介者,定义通信接口
ConcreteMediator 具体中介者,协调各同事对象的行为
Colleague 抽象同事类,持有中介者引用
ConcreteColleague 具体同事类,通过中介者与其他同事通信

5. 代码示例

5.1 聊天室示例

java 复制代码
// 抽象中介者
interface ChatMediator {
    void sendMessage(String msg, User user);
    void addUser(User user);
}

// 具体中介者
class ChatRoom implements ChatMediator {
    private List<User> users = new ArrayList<>();
    
    public void sendMessage(String msg, User user) {
        for (User u : users) {
            if (u != user) {  // 不发送给自己
                u.receive(msg);
            }
        }
    }
    
    public void addUser(User user) {
        users.add(user);
    }
}

// 抽象同事类
abstract class User {
    protected ChatMediator mediator;
    protected String name;
    
    public User(ChatMediator med, String name) {
        this.mediator = med;
        this.name = name;
    }
    
    public abstract void send(String msg);
    public abstract void receive(String msg);
}

// 具体同事类
class ChatUser extends User {
    public ChatUser(ChatMediator med, String name) {
        super(med, name);
    }
    
    public void send(String msg) {
        System.out.println(name + " 发送消息: " + msg);
        mediator.sendMessage(msg, this);
    }
    
    public void receive(String msg) {
        System.out.println(name + " 收到消息: " + msg);
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        ChatMediator chatRoom = new ChatRoom();
        
        User alice = new ChatUser(chatRoom, "Alice");
        User bob = new ChatUser(chatRoom, "Bob");
        User charlie = new ChatUser(chatRoom, "Charlie");
        
        chatRoom.addUser(alice);
        chatRoom.addUser(bob);
        chatRoom.addUser(charlie);
        
        alice.send("大家好!");
        /* 输出:
           Alice 发送消息: 大家好!
           Bob 收到消息: 大家好!
           Charlie 收到消息: 大家好! */
    }
}

6. 模式变种

6.1 事件总线模式

java 复制代码
// 基于观察者模式的扩展
class EventBusMediator {
    private Map<Class<?>, List<Consumer<?>>> handlers = new ConcurrentHashMap<>();
    
    public <T> void subscribe(Class<T> eventType, Consumer<T> handler) {
        handlers.computeIfAbsent(eventType, k -> new ArrayList<>()).add(handler);
    }
    
    public <T> void publish(T event) {
        List<Consumer<?>> consumers = handlers.get(event.getClass());
        if (consumers != null) {
            consumers.forEach(c -> ((Consumer<T>)c).accept(event));
        }
    }
}

// 使用示例
EventBusMediator bus = new EventBusMediator();
bus.subscribe(String.class, msg -> System.out.println("处理字符串: " + msg));
bus.publish("测试消息");

7. 优缺点分析

✔️ 优点

  • 减少对象间耦合
  • 集中控制交互逻辑
  • 简化同事类实现
  • 符合迪米特法则
  • 便于扩展新的同事类

缺点

  • 中介者可能变得过于复杂(上帝对象)
  • 中介者故障会导致系统整体失效
  • 可能降低系统运行效率
  • 增加系统设计复杂度

8. 相关模式对比

模式 目的 关键区别
观察者模式 对象间通知机制 观察者模式是分布式,中介者是集中式
门面模式 简化子系统接口 门面模式侧重简化接口,中介者协调交互
代理模式 控制对象访问 中介者协调多个对象,代理控制单个对象

9. 实际应用案例

  • Java Timer的调度机制(协调多个TimerTask)
  • MVC框架的控制器(协调Model和View)
  • 航空管制系统(协调飞机通信)
  • GUI框架中的对话框组件交互
  • 游戏引擎中的碰撞检测系统
  • Spring框架的ApplicationContext
  • JMS(Java Message Service)的消息路由

10. 最佳实践建议

  1. 合理划分职责:避免中介者承担过多责任
  2. 分层中介者:复杂系统可建立多级中介者
  3. 结合其他模式
    • 与观察者模式结合实现事件通知
    • 与命令模式结合实现操作队列
  4. 使用接口编程:保持中介者和同事类的抽象性
  5. 异常处理机制:确保中介者可靠处理异常
  6. 性能优化:对高频交互进行批处理或异步处理

11. 扩展应用(订单处理系统)

java 复制代码
// 中介者接口
interface OrderMediator {
    void placeOrder(Order order);
    void cancelOrder(String orderId);
    void notifyWarehouse(Order order);
    void notifyPayment(Order order);
}

// 具体中介者
class OrderProcessor implements OrderMediator {
    private PaymentService payment;
    private WarehouseService warehouse;
    private NotificationService notification;
    
    public void placeOrder(Order order) {
        if (payment.process(order)) {
            warehouse.prepare(order);
            notification.sendEmail(order.getUser(), "订单已确认");
        }
    }
    
    // 实现其他方法...
}

// 同事类示例
class PaymentService {
    private OrderMediator mediator;
    
    public boolean process(Order order) {
        // 支付处理逻辑...
        mediator.notifyWarehouse(order);
        return true;
    }
}

// 客户端调用
OrderMediator mediator = new OrderProcessor();
Order order = new Order("123", 99.99);
mediator.placeOrder(order);

🎯 设计原则体现

  1. 迪米特法则:减少对象间的直接通信
  2. 单一职责原则:交互逻辑集中到中介者
  3. 开闭原则:新增同事类无需修改现有代码

通过中介者模式,可以有效地解耦复杂系统中的交互关系,特别适合需要集中管理多方交互的企业级应用场景。该模式在GUI开发、工作流引擎和分布式系统协调中应用广泛,是管理复杂对象关系的经典解决方案。

相关推荐
Engineer邓祥浩1 小时前
设计模式学习(16) 23-14 命令模式
学习·设计模式·命令模式
Maddie_Mo2 小时前
智能体设计模式 第二章:路由模式
设计模式
一条闲鱼_mytube5 小时前
智能体设计模式(五)人机协同-知识检索RAG-智能体间通信
网络·人工智能·设计模式
小码过河.5 小时前
设计模式——建造者模式
单片机·设计模式·建造者模式
小码过河.7 小时前
设计模式——工厂方法模式
设计模式·工厂方法模式
把csdn当日记本的菜鸡7 小时前
Java设计模式简单入门
java·开发语言·设计模式
老蒋每日coding8 小时前
AI Agent 设计模式系列(十一)—— 目标设定和监控模式
人工智能·设计模式·langchain
蔺太微8 小时前
外观模式(Facade Pattern)
设计模式·外观模式
进击的小头8 小时前
C语言实现设计模式的核心基石
c语言·开发语言·设计模式
Engineer邓祥浩8 小时前
设计模式学习(15) 23-13 模版方法模式
java·学习·设计模式