23种设计模式23种设计模式
首页
介绍
  • 单例模式
  • 工厂方法模式
  • 抽象工厂模式
  • 建造者模式
  • 原型模式
  • 适配器模式
  • 桥接模式
  • 组合模式
  • 装饰器模式
  • 外观模式
  • 享元模式
  • 代理模式
  • 责任链模式
  • 命令模式
  • 解释器模式
  • 迭代器模式
  • 中介者模式
  • 备忘录模式
  • 观察者模式
  • 状态模式
  • 策略模式
  • 模板方法模式
  • 访问者模式
🚀 编程指南
首页
介绍
  • 单例模式
  • 工厂方法模式
  • 抽象工厂模式
  • 建造者模式
  • 原型模式
  • 适配器模式
  • 桥接模式
  • 组合模式
  • 装饰器模式
  • 外观模式
  • 享元模式
  • 代理模式
  • 责任链模式
  • 命令模式
  • 解释器模式
  • 迭代器模式
  • 中介者模式
  • 备忘录模式
  • 观察者模式
  • 状态模式
  • 策略模式
  • 模板方法模式
  • 访问者模式
🚀 编程指南
  • 行为型模式

    • 责任链模式 (Chain of Responsibility)
    • 命令模式 (Command)
    • 解释器模式 (Interpreter)
    • 迭代器模式 (Iterator)
    • 中介者模式 (Mediator)
    • 备忘录模式 (Memento)
    • 观察者模式 (Observer)
    • 状态模式 (State)
    • 策略模式 (Strategy)
    • 模板方法模式 (Template Method)
    • 访问者模式 (Visitor)

中介者模式 (Mediator)

📖 通俗理解

想象一个房产中介:

  • 没有中介:房东和租客直接联系,一个房东要和无数租客沟通
  • 有中介:房东和租客都只和中介沟通,中介负责协调

中介者模式就是:用一个中介对象来封装一系列对象之间的交互,使对象之间不直接引用。

🎯 解决什么问题?

当多个对象之间存在复杂的网状依赖关系时,用中介者来解耦,变成星形结构。

网状结构(混乱)          星形结构(清晰)
A ─── B                    A
│ ╲ ╱ │                    │
│  ╳  │        ──>      中介者
│ ╱ ╲ │                 ╱  │  ╲
C ─── D                B   C   D

🌰 生活中的例子

  • 房产中介
  • 聊天室:用户消息通过服务器转发
  • 机场调度塔:飞机起降由调度塔协调

💻 Java 代码实现

场景:聊天室

/**
 * 中介者接口:聊天室
 */
public interface ChatRoom {
    void sendMessage(String message, User user);
    void addUser(User user);
}

/**
 * 具体中介者
 */
public class ChatRoomImpl implements ChatRoom {
    private List<User> users = new ArrayList<>();
    
    @Override
    public void addUser(User user) {
        users.add(user);
        System.out.println(user.getName() + " 加入了聊天室");
    }
    
    @Override
    public void sendMessage(String message, User sender) {
        for (User user : users) {
            if (user != sender) {
                user.receive(message, sender.getName());
            }
        }
    }
}

/**
 * 同事类:用户
 */
public class User {
    private String name;
    private ChatRoom chatRoom;
    
    public User(String name, ChatRoom chatRoom) {
        this.name = name;
        this.chatRoom = chatRoom;
    }
    
    public String getName() {
        return name;
    }
    
    public void send(String message) {
        System.out.println(name + " 发送: " + message);
        chatRoom.sendMessage(message, this);
    }
    
    public void receive(String message, String from) {
        System.out.println(name + " 收到来自 " + from + " 的消息: " + message);
    }
}

使用:

public class Client {
    public static void main(String[] args) {
        ChatRoom chatRoom = new ChatRoomImpl();
        
        User alice = new User("Alice", chatRoom);
        User bob = new User("Bob", chatRoom);
        User charlie = new User("Charlie", chatRoom);
        
        chatRoom.addUser(alice);
        chatRoom.addUser(bob);
        chatRoom.addUser(charlie);
        
        System.out.println();
        alice.send("大家好!");
        System.out.println();
        bob.send("你好 Alice!");
    }
}

输出:

Alice 加入了聊天室
Bob 加入了聊天室
Charlie 加入了聊天室

Alice 发送: 大家好!
Bob 收到来自 Alice 的消息: 大家好!
Charlie 收到来自 Alice 的消息: 大家好!

Bob 发送: 你好 Alice!
Alice 收到来自 Bob 的消息: 你好 Alice!
Charlie 收到来自 Bob 的消息: 你好 Alice!

✅ 适用场景

  1. 对象之间存在复杂的引用关系
  2. 想通过一个中间类来封装多个类的行为
  3. 想简化多个对象之间的通信

⚠️ 注意

中介者可能变得过于庞大和复杂(上帝类),需要注意控制。


小结

中介者模式:用中介对象封装对象间的交互,对象之间不直接引用。

应用:MVC 中的 Controller、消息队列

👉 下一篇:备忘录模式

Prev
迭代器模式 (Iterator)
Next
备忘录模式 (Memento)