Java行为型模式---中介者模式

发布于:2025-07-21 ⋅ 阅读:(14) ⋅ 点赞:(0)

中介者模式基础概念

中介者模式(Mediator Pattern)是一种行为型设计模式,其核心思想是通过一个中介对象来封装一系列对象之间的交互,使各对象不需要显式地相互引用,从而降低耦合度,并可以独立地改变它们之间的交互。中介者模式将多对多的交互转化为一对多的交互,集中控制对象间的通信。

中介者模式的核心组件

  1. 抽象中介者(Mediator) - 定义中介者与同事对象之间的通信接口。
  2. 具体中介者(ConcreteMediator) - 实现抽象中介者接口,协调各同事对象之间的交互,持有所有同事对象的引用。
  3. 抽象同事类(Colleague) - 定义同事类的公共接口,每个同事对象都知道其中介者对象,并通过中介者进行通信。
  4. 具体同事类(ConcreteColleague) - 实现抽象同事类,只知道中介者而不知道其他同事对象,通过中介者与其他同事通信。

中介者模式的实现

下面通过一个简单的聊天室示例展示中介者模式的实现:

// 1. 抽象中介者
interface ChatMediator {
    void sendMessage(String message, User user);
    void addUser(User user);
}

// 2. 具体中介者 - 聊天室
class ChatRoom implements ChatMediator {
    private List<User> users = new ArrayList<>();
    
    @Override
    public void sendMessage(String message, User user) {
        // 中介者负责消息的转发
        for (User u : users) {
            if (u != user) {  // 不发送给自己
                u.receiveMessage(message);
            }
        }
    }
    
    @Override
    public void addUser(User user) {
        users.add(user);
    }
}

// 3. 抽象同事类 - 用户
abstract class User {
    protected ChatMediator mediator;
    protected String name;
    
    public User(ChatMediator mediator, String name) {
        this.mediator = mediator;
        this.name = name;
    }
    
    public abstract void send(String message);
    public abstract void receiveMessage(String message);
}

// 4. 具体同事类 - 普通用户
class NormalUser extends User {
    public NormalUser(ChatMediator mediator, String name) {
        super(mediator, name);
    }
    
    @Override
    public void send(String message) {
        System.out.println(name + " 发送消息: " + message);
        mediator.sendMessage(message, this);  // 通过中介者发送消息
    }
    
    @Override
    public void receiveMessage(String message) {
        System.out.println(name + " 收到消息: " + message);
    }
}

// 5. 具体同事类 - VIP用户
class VIPUser extends User {
    public VIPUser(ChatMediator mediator, String name) {
        super(mediator, name);
    }
    
    @Override
    public void send(String message) {
        System.out.println("[VIP] " + name + " 发送消息: " + message);
        mediator.sendMessage("[VIP] " + message, this);  // VIP消息添加特殊标识
    }
    
    @Override
    public void receiveMessage(String message) {
        System.out.println(name + " 收到消息: " + message);
    }
}

// 6. 客户端代码
public class MediatorPatternClient {
    public static void main(String[] args) {
        // 创建中介者
        ChatMediator chatRoom = new ChatRoom();
        
        // 创建同事对象
        User user1 = new NormalUser(chatRoom, "张三");
        User user2 = new NormalUser(chatRoom, "李四");
        User user3 = new VIPUser(chatRoom, "王五");
        
        // 将同事添加到中介者
        chatRoom.addUser(user1);
        chatRoom.addUser(user2);
        chatRoom.addUser(user3);
        
        // 发送消息
        user1.send("大家好!");
        System.out.println();
        user3.send("欢迎加入聊天室!");
    }
}

中介者模式的应用场景

  1. 系统中对象间依赖复杂 - 当对象间存在大量的相互引用和交互,导致依赖关系混乱时
  2. 集中控制交互 - 需要集中控制多个对象间的交互逻辑时
  3. MVC 架构 - 控制器(Controller)作为视图(View)和模型(Model)的中介
  4. GUI 组件交互 - 如窗口中多个组件间的联动
  5. 消息队列系统 - 消息中间件作为生产者和消费者的中介
  6. 多人游戏 - 游戏服务器作为玩家之间的中介,处理消息转发

中介者模式的优缺点

优点

  • 降低耦合度 - 对象间无需显式引用,减少了对象间的依赖关系
  • 集中控制交互 - 将交互逻辑集中在中介者中,便于维护和修改
  • 符合开闭原则 - 可以在不修改现有同事类的情况下,通过扩展中介者类来新增交互方式
  • 简化对象协议 - 将多对多的交互转化为一对多的交互,简化了通信协议
  • 便于复用 - 单个同事类可以在不同的中介者环境中复用

缺点

  • 中介者类膨胀 - 中介者承担了过多的交互逻辑,可能变得复杂庞大
  • 维护难度增加 - 中介者类的修改可能影响多个同事类,增加维护风险
  • 系统响应变慢 - 所有交互都通过中介者,可能导致系统响应性能下降
  • 违反单一职责原则 - 中介者类可能负责过多的功能,导致职责不清晰
  • 调试困难 - 中介者中的交互逻辑可能复杂,导致调试困难

使用中介者模式的注意事项

  1. 控制中介者复杂度 - 避免中介者类过于庞大,可将部分逻辑分解为更小的组件
  2. 合理设计中介者接口 - 确保中介者接口清晰,不包含无关功能
  3. 避免过度使用 - 仅在对象间交互复杂且需要集中控制时使用中介者模式
  4. 与观察者模式结合 - 中介者模式可以与观察者模式结合,实现事件驱动的交互
  5. 考虑性能影响 - 对于高性能要求的系统,需谨慎使用中介者模式
  6. 测试中介者 - 由于中介者集中了大量逻辑,应对其进行充分测试

总结

中介者模式通过引入一个中介对象来封装对象间的交互,将多对多的依赖关系转化为一对多的关系,从而降低系统的耦合度,提高可维护性和可扩展性。它在需要集中控制对象交互的场景中尤为有用,如 GUI 系统、消息队列、多人游戏等。合理使用中介者模式可以使系统结构更加清晰,但需注意控制中介者类的复杂度,避免其成为系统的瓶颈。


网站公告

今日签到

点亮在社区的每一天
去签到