自学教程 学编程从这里开始

中介者模式

《中介者模式》|设计模式系列第22篇

系列:行为型模式 · 中介者模式(Mediator Pattern)
关键词:解耦多对象交互、中央调度、减少对象耦合、同事类

一、什么是中介者模式

中介者模式(Mediator Pattern):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

属于行为型设计模式。

简单理解:
多个同事对象不再直接互相通信,所有消息都交给中介者中转。同事类只依赖中介者,不需要持有其他同事的引用,将网状复杂依赖转为星型结构。
例子:聊天室。所有用户不直接互相发消息,全部发送给聊天室(中介者),由聊天室转发给目标用户。

核心意图
将多对多对象交互逻辑抽离到中介者,降低同事对象之间耦合。

适用场景

  1. 多个对象之间存在复杂多对多交互关系
  2. 想集中管理交互逻辑
  3. 复用同事对象,同事之间解耦
  4. 聊天室、消息网关、事件调度器、UI组件联动

⚠️ 缺点预警:交互逻辑全部汇聚到中介者,中介者会变得庞大复杂,维护成本上升。

二、UML结构图

角色划分:

  1. Mediator(抽象中介者):定义同事对象通信接口
  2. ConcreteMediator(具体中介者):维护所有同事引用,实现交互调度逻辑
  3. Colleague(抽象同事):持有中介者引用,发送/接收消息
  4. ConcreteColleague(具体同事):实现自身业务,通信交给中介者
  5. Client(客户端):创建中介者与同事对象,绑定关系

三、Java 完整示例

场景:ChatRoom 聊天室中介,User 用户同事类。代码全部使用英文。

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

// Mediator
public interface Mediator {
    void register(User user);
    void relay(String from, String message);
}

// ConcreteMediator
public class ChatRoom implements Mediator {
    private List<User> userList = new ArrayList<>();

    @Override
    public void register(User user) {
        userList.add(user);
        user.setMediator(this);
    }

    @Override
    public void relay(String from, String message) {
        for(User user : userList) {
            if(!user.getName().equals(from)) {
                user.receive(from, message);
            }
        }
    }
}

// Colleague
public abstract class User {
    protected Mediator mediator;
    protected String name;

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

    public String getName() {
        return name;
    }

    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

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

// ConcreteColleague
public class ChatUser extends User {
    public ChatUser(String name) {
        super(name);
    }

    @Override
    public void send(String message) {
        mediator.relay(name, message);
    }

    @Override
    public void receive(String from, String message) {
        System.out.println(name + " receive message from " + from + ": " + message);
    }
}

// Client
public class Client {
    public static void main(String[] args) {
        Mediator chatRoom = new ChatRoom();
        User u1 = new ChatUser("Alice");
        User u2 = new ChatUser("Bob");
        User u3 = new ChatUser("Jack");

        chatRoom.register(u1);
        chatRoom.register(u2);
        chatRoom.register(u3);

        u1.send("Hello everyone");
        u2.send("Hi Alice");
    }
}

运行输出:

Bob receive message from Alice: Hello everyone
Jack receive message from Alice: Hello everyone
Alice receive message from Bob: Hi Alice
Jack receive message from Bob: Hi Alice

四、中介者模式 vs 观察者模式

模式目标核心
Mediator多对象之间双向交互,由中介统一调度集中控制多方通信,同事不知道彼此
Observer一对多单向消息推送,主题通知订阅者主题发生变化,自动通知所有观察者

五、优缺点总结

✅ 优点

  1. 将多对多复杂依赖简化为一对多(同事 ↔ 中介者)
  2. 同事之间解耦,可以独立修改同事类
  3. 交互逻辑集中在中介,方便统一管理

❌ 缺点

  1. 所有交互逻辑集中在中介者,中介类容易膨胀、变成上帝类
  2. 中介者一旦复杂,调试和维护困难

六、框架源码应用

  • Spring MVC DispatcherServlet(前端控制器,中介思想)
  • JMS消息中间件
  • EventBus 事件总线

七、小结

中介者模式核心:同事对象不直接通信,全部通过中介者转发消息,消除多对多耦合。
使用建议:对象之间网状依赖时考虑中介者;控制中介者复杂度,避免中介无限膨胀。

标签:

0 条笔记