设计模式——中介者模式

中介者模式 (Mediator Pattern)

什么是中介者模式?

中介者模式是一种行为型设计模式,它允许你减少对象之间的混乱依赖关系,通过一个中介者对象来协调多个对象之间的交互。

简单来说:中介者模式就是"中间人",让对象通过中间人来通信,而不是直接通信。

生活中的例子

想象一下:

  • 聊天室:用户通过聊天室发送消息,而不是直接发送
  • 机场塔台:飞机通过塔台协调,而不是直接通信
  • 房产中介:买卖双方通过中介交易

为什么需要中介者模式?

传统方式的问题

java 复制代码
// 对象之间直接通信
object1.send(object2);
object2.send(object3);
object3.send(object1);

问题

  1. 耦合度高:对象之间耦合度高
  2. 难以维护:修改一个对象会影响其他对象
  3. 难以扩展:新增对象需要修改多个对象

中介者模式的优势

java 复制代码
// 对象通过中介者通信
mediator.send(object1, object2);
mediator.send(object2, object3);

优势

  1. 解耦合:降低对象之间的耦合度
  2. 集中管理:集中管理对象之间的交互
  3. 易于扩展:新增对象很容易

中介者模式的结构

复制代码
┌─────────────────────┐
│     Mediator        │  中介者接口
├─────────────────────┤
│ + send(): void      │
└──────────┬──────────┘
           │ 实现
           │
┌──────────┴──────────┐
│ ConcreteMediator    │  具体中介者
├─────────────────────┤
│ - colleagues: List  │
│ + send(): void      │
│ + add(): void       │
└─────────────────────┘

┌─────────────────────┐
│     Colleague       │  同事接口
├─────────────────────┤
│ - mediator: Med     │
│ + send(): void      │
│ + receive(): void   │
└──────────┬──────────┘
           │ 继承
           ├──┬──────────────────┬──────────────┐
           │                    │              │
┌──────────┴──────┐  ┌───────────┴───────┐  ┌───┴────────┐
│ ConcreteCol1     │  │ ConcreteCol2     │  │ ...       │  具体同事
├─────────────────┤  ├───────────────────┤  ├────────────┤
│ + receive()     │  │ + receive()       │  │            │
└─────────────────┘  └───────────────────┘  └────────────┘

代码示例

1. 定义中介者接口

java 复制代码
/**
 * 中介者接口
 */
public interface Mediator {
    /**
     * 发送消息
     * @param message 消息
     * @param colleague 发送消息的同事
     */
    void send(String message, Colleague colleague);
}

2. 定义同事接口

java 复制代码
/**
 * 同事接口
 */
public abstract class Colleague {
    protected Mediator mediator;
    
    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }
    
    /**
     * 发送消息
     */
    public abstract void send(String message);
    
    /**
     * 接收消息
     */
    public abstract void receive(String message);
}

3. 定义具体中介者

java 复制代码
/**
 * 具体中介者:聊天室
 */
public class ChatRoom implements Mediator {
    private List<Colleague> colleagues = new ArrayList<>();
    
    /**
     * 添加同事
     */
    public void addColleague(Colleague colleague) {
        colleagues.add(colleague);
    }
    
    @Override
    public void send(String message, Colleague colleague) {
        for (Colleague c : colleagues) {
            if (c != colleague) {
                c.receive(message);
            }
        }
    }
}

4. 定义具体同事

java 复制代码
/**
 * 具体同事:用户
 */
public class User extends Colleague {
    private String name;
    
    public User(Mediator mediator, String name) {
        super(mediator);
        this.name = name;
    }
    
    @Override
    public void send(String message) {
        System.out.println(name + "发送: " + message);
        mediator.send(message, this);
    }
    
    @Override
    public void receive(String message) {
        System.out.println(name + "收到: " + message);
    }
}

5. 使用中介者

java 复制代码
/**
 * 中介者模式测试类
 * 演示如何使用中介者模式实现聊天室功能
 */
public class MediatorTest {
    
    public static void main(String[] args) {
        System.out.println("=== 中介者模式测试 ===\n");
        
        // 创建中介者
        ChatRoom chatRoom = new ChatRoom();
        
        // 创建同事
        Colleague user1 = new User(chatRoom, "张三");
        Colleague user2 = new User(chatRoom, "李四");
        Colleague user3 = new User(chatRoom, "王五");
        
        // 添加同事到中介者
        chatRoom.addColleague(user1);
        chatRoom.addColleague(user2);
        chatRoom.addColleague(user3);
        
        // 测试消息发送
        System.out.println("--- 张三发送消息 ---");
        user1.send("大家好!");
        
        System.out.println("\n--- 李四发送消息 ---");
        user2.send("你好!");
        
        System.out.println("\n--- 王五发送消息 ---");
        user3.send("很高兴认识大家!");
        
        System.out.println("\n=== 中介者模式的优势 ===");
        System.out.println("1. 解耦合:降低对象之间的耦合度");
        System.out.println("2. 集中管理:集中管理对象之间的交互");
        System.out.println("3. 易于扩展:新增对象很容易");
        System.out.println("4. 简化交互:简化对象之间的交互");
        
        System.out.println("\n=== 实际应用场景 ===");
        System.out.println("1. 聊天室:用户通过聊天室通信");
        System.out.println("2. GUI框架:组件之间通过中介者通信");
        System.out.println("3. MVC模式:控制器作为中介者");
        System.out.println("4. 航空管制:飞机通过塔台协调");
    }
}

中介者模式的优点

  1. 解耦合:降低对象之间的耦合度
  2. 集中管理:集中管理对象之间的交互
  3. 易于扩展:新增对象很容易
  4. 简化交互:简化对象之间的交互

中介者模式的缺点

  1. 中介者复杂:中介者可能变得复杂
  2. 性能问题:所有交互都通过中介者

适用场景

  1. 多个对象:有多个对象需要交互
  2. 耦合度高:对象之间耦合度高
  3. 集中管理:需要集中管理交互

常见应用场景

  • 聊天室:用户通过聊天室通信
  • GUI框架:组件之间通过中介者通信
  • MVC模式:控制器作为中介者

使用建议

  • 多个对象:使用中介者模式
  • 耦合度高:使用中介者模式
  • 简单交互:直接通信即可

注意事项

⚠️ 中介者模式虽然有用,但要注意:

  • 不要让中介者过于复杂
  • 考虑使用事件总线
相关推荐
Geoking.16 小时前
【设计模式】中介者模式(Mediator)详解
java·设计模式·中介者模式
胖虎15 天前
iOS中的设计模式(十)- 中介者模式(从播放器场景理解中介者模式)
设计模式·中介者模式·解耦·ios中的设计模式
刀法孜然5 天前
23种设计模式 3 行为型模式 之3.6 mediator 中介者模式
设计模式·中介者模式
a35354138210 天前
设计模式-中介者模式
c++·设计模式·中介者模式
JavaBoy_XJ17 天前
行为型-中介者模式
中介者模式
__万波__17 天前
二十三种设计模式(十八)--中介者模式
java·设计模式·中介者模式
syt_101324 天前
设计模式之-中介者模式
设计模式·中介者模式
明洞日记1 个月前
【设计模式手册016】中介者模式 - 解耦多对象交互
c++·设计模式·交互·中介者模式
崇文殿大学士1 个月前
C# MediatR 中介者模式 观察者模式
观察者模式·c#·中介者模式