设计模式之-中介者模式

一、定义(Definition)

中介者模式(Mediator Pattern)是一种行为型设计模式,它通过一个中介对象来封装一系列对象之间的交互,使对象之间不需要直接引用彼此,从而降低它们之间的耦合度。

简而言之,中介者模式将多个对象间复杂的通信关系转移到一个中介者对象中,使得对象之间的耦合松散,交互更灵活且易维护。

二、适用场景(When to Use)

  • 系统中对象之间存在复杂的网状通信关系,难以维护和扩展;
  • 希望简化对象之间的通信,避免对象间相互引用;
  • 需要集中控制交互行为,便于管理和拓展;
  • 适合用在聊天室、飞机调度、GUI 事件处理、工作流协调等场景。

三、核心角色(Participants)

角色

说明

Mediator

抽象中介者,定义同事对象通信的接口

ConcreteMediator

具体中介者,协调各个同事对象之间的交互

Colleague

抽象同事类,声明与中介者通信的接口

ConcreteColleague

具体同事类,实现同事的具体行为和与中介者的通信

四、UML 类图(UML Diagram)


          +-----------------------+
          |    Mediator      -----|
          |-----------------------|
          | +send(message, sender)|
          +-----------------------+
                ▲
                |
    +------------------------+
    | ConcreteMediator       |
    |------------------------|
    | - colleague1           |
    | - colleague2           |
    | +send()                |
    +------------------------+

    +------------+          +-------------+
    | Colleague  |          | Colleague   |
    |------------|          |-------------|
    | +send()    |          | +send()     |
    | +receive() |          | +receive()  |
    +------------+          +-------------+
         ▲                         ▲
         |                         |
 +-----------------+      +------------------+
 | ConcreteColleague1|     | ConcreteColleague2|
 +------------------+     +-------------------+

五、真实业务场景示例

 场景说明:聊天室(Chat Room)

假设有多个用户(同事类)参与聊天,通过聊天室(中介者)来转发消息,避免用户之间直接通信。

 1. 抽象中介者(Mediator 角色)

// Mediator:抽象中介者,定义发送消息接口
public interface ChatRoomMediator {
    void sendMessage(String message, User sender);
    void addUser(User user);
}

 2. 具体中介者(ConcreteMediator 角色)

// ConcreteMediator:具体聊天室,负责协调用户消息转发
public class ChatRoom implements ChatRoomMediator {

    private List<User> users = new ArrayList<>();

    @Override
    public void sendMessage(String message, User sender) {
        for (User user : users) {
            // 不发送给消息发送者自己
            if (user != sender) {
                user.receive(message);
            }
        }
    }

    @Override
    public void addUser(User user) {
        users.add(user);
    }
}

3. 抽象同事类(Colleague 角色)

// Colleague:抽象用户类,关联中介者
public abstract class User {
    protected ChatRoomMediator mediator;
    protected String name;

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

    public abstract void send(String message);

    public abstract void receive(String message);
}

 4. 具体同事类(ConcreteColleague 角色)

// ConcreteColleague:具体用户类,实现发送和接收消息
public class ChatUser extends User {

    public ChatUser(ChatRoomMediator mediator, String name) {
        super(mediator, name);
    }

    @Override
    public void send(String message) {
        System.out.println(this.name + " 发送消息: " + message);
        mediator.sendMessage(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println(this.name + " 收到消息: " + message);
    }
}

 5. 客户端测试(Client)

public class MediatorPatternDemo {
    public static void main(String[] args) {
        ChatRoomMediator 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("Hello everyone!");
        bob.send("Hi Alice!");
    }
}

六、类与角色对照表

类名

模式角色

说明

ChatRoomMediator

Mediator

抽象中介者,定义通信接口

ChatRoom

ConcreteMediator

具体中介者,实现通信协调

User

Colleague

抽象同事,定义接口

ChatUser

ConcreteColleague

具体同事,实现具体行为

MediatorPatternDemo

Client

客户端,测试中介者模式

七、优缺点分析

✅ 优点

优点

说明

降低对象间耦合度

同事对象不直接引用彼此,依赖中介者

统一管理交互

中介者集中处理交互逻辑,便于维护和修改

符合单一职责原则

各个同事对象专注自身业务,中介者负责通信

便于扩展和复用

新增同事类或修改交互方式只需改中介者

❌ 缺点

缺点

说明

中介者过于复杂

所有交互集中,中介者逻辑可能变得臃肿

中介者承担过多责任

可能违背单一职责,维护难度提升

性能开销

中介者转发消息可能引入额外开销

八、真实应用场景

场景

描述

聊天系统

多用户消息通过中介者(服务器)转发

航空交通控制

飞机通过中介者(空中交通管制)协调起降

GUI 组件交互

各控件通过中介者管理事件传递

工作流管理

各节点通过中介者协同完成复杂流程

设备互联

物联网设备通过中介器统一管理和通信

九、总结(Summary)

中介者模式通过引入中介者对象,减少了系统中对象间的直接依赖,使系统更具灵活性和可维护性。适合用于对象间复杂交互,集中管理逻辑,特别是多对多的通信场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码蚁Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值