当前位置: 首页 > article >正文

中介者模式 (Mediator Pattern)

文章目录

      • 中介者模式 (Mediator Pattern)
      • 原理
      • 优点
      • 缺点
      • 示例代码
        • 场景描述
        • 1. 定义中介者接口
        • 2. 实现具体中介者
        • 3. 定义同事类接口
        • 4. 实现具体同事类
        • 5. 客户端代码
        • 输出结果
      • UML 类图
      • 使用场景
      • 小结

中介者模式 (Mediator Pattern)

中介者模式是一种 行为型设计模式,用来降低对象之间的耦合性。它通过引入一个中介者对象,来统一管理对象之间的交互,使得各对象无需直接引用彼此,从而使系统更加灵活和易于扩展。


原理

  1. 核心思想
    • 将对象之间复杂的网状关系转化为简单的星型关系。
    • 对象通过中介者进行通信,避免直接相互依赖。
  2. 适用场景
    • 系统中对象之间存在大量交互,导致对象之间耦合度过高。
    • 希望通过引入中介者减少对象之间的直接依赖。
    • 需要动态增加或减少交互对象。
  3. 参与角色
    • Mediator(中介者接口)
      • 定义与同事对象交互的接口。
    • ConcreteMediator(具体中介者)
      • 实现中介者接口,负责协调各同事对象的交互。
    • Colleague(同事类接口)
      • 定义与中介者通信的方法。
    • ConcreteColleague(具体同事类)
      • 具体的对象类,通过中介者与其他对象交互。

优点

  1. 降低耦合
    • 对象之间不直接通信,减少了类之间的依赖。
  2. 增强灵活性
    • 可以方便地修改交互逻辑或增加新对象。
  3. 集中管理
    • 交互逻辑集中在中介者中,便于维护。

缺点

  1. 中介者复杂性
    • 中介者承担了所有交互逻辑,可能变得复杂且难以维护。
  2. 单点问题
    • 中介者过于重要,如果其出现问题,会影响所有交互。

示例代码

场景描述

一个聊天室系统中,用户通过聊天室发送消息,而不是直接与其他用户通信。


1. 定义中介者接口
// 中介者接口
public interface ChatMediator {
    void sendMessage(String message, User user);
    void addUser(User user);
}

2. 实现具体中介者
import java.util.ArrayList;
import java.util.List;

// 具体中介者
public class ChatRoom implements ChatMediator {
    private List<User> users;

    public ChatRoom() {
        this.users = new ArrayList<>();
    }

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

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

3. 定义同事类接口
// 同事类接口
public abstract class User {
    protected ChatMediator mediator;
    protected String name;

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

    public String getName() {
        return name;
    }

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

4. 实现具体同事类
// 具体同事类
public class ChatUser extends User {

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

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

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

5. 客户端代码
public class MediatorPatternExample {
    public static void main(String[] args) {
        // 创建中介者
        ChatMediator chatRoom = new ChatRoom();

        // 创建用户
        User user1 = new ChatUser(chatRoom, "Alice");
        User user2 = new ChatUser(chatRoom, "Bob");
        User user3 = new ChatUser(chatRoom, "Charlie");

        // 添加用户到聊天室
        chatRoom.addUser(user1);
        chatRoom.addUser(user2);
        chatRoom.addUser(user3);

        // 用户发送消息
        user1.send("Hi everyone!");
        user2.send("Hello Alice!");
    }
}

输出结果
Alice sends: Hi everyone!
Bob received from Alice: Hi everyone!
Charlie received from Alice: Hi everyone!

Bob sends: Hello Alice!
Alice received from Bob: Hello Alice!
Charlie received from Bob: Hello Alice!

UML 类图

                +----------------+
                |  ChatMediator  |
                +----------------+
                | + sendMessage()|
                | + addUser()    |
                +----------------+
                        ^
                        |
         +-------------------------------+
         | ConcreteMediator (ChatRoom)   |
         +-------------------------------+
         | - users : List<User>          |
         | + sendMessage()               |
         | + addUser()                   |
         +-------------------------------+
                        ^
                        |
                +----------------+
                |     User       |
                +----------------+
                | - mediator     |
                | - name         |
                | + send()       |
                | + receive()    |
                +----------------+
                        ^
                        |
        +--------------------------------+
        | ConcreteColleague (ChatUser)  |
        +--------------------------------+
        | + send()                      |
        | + receive()                   |
        +--------------------------------+

使用场景

  1. 聊天室系统
    • 如 Slack、Teams 等系统。
  2. GUI组件交互
    • 在图形界面中,各组件(如按钮、文本框)通过中介者协同工作。
  3. 工作流管理
    • 如订单处理系统中,订单、支付、库存等模块通过中介者通信。

小结

  • 中介者模式通过引入中介者减少了对象之间的耦合,使得系统更加灵活。
  • 适用于需要协调多个对象行为的场景。
  • 需注意中介者可能成为系统的单点瓶颈,应合理设计其复杂度和职责范围。

http://www.kler.cn/a/416051.html

相关文章:

  • 使用postcss动态设置fontsize,刷新时出现极小页面的问题
  • C++趣味编程:基于树莓派Pico的模拟沙漏-倾斜开关与LED的互动实现
  • RPA:电商订单处理自动化
  • Elasticsearch 分片分配策略讲解与实战
  • ollama部署bge-m3,并实现与dify平台对接
  • 【设计模式】【结构型模式(Structural Patterns)】之享元模式(Flyweight Pattern)
  • 无人机飞行控制系统多机控制技术详解
  • 大模型翻译能力评测
  • C++ Qt——从入门到入土 (三)
  • oracle中删除指定前缀的表
  • Oracle 插入数据的存储过程
  • CAN收发器芯片TJA1042规格书解读
  • C# 进行AI工程开发
  • Web3开发指南:构建去中心化应用(DApps)的关键步骤
  • Java基础常用类库全解析
  • kafka消费者组和分区数之间的关系是怎样的?
  • 【AIGC】2023-ICCV-用于高保真语音肖像合成的高效区域感知神经辐射场
  • 将有序数组转换为二叉搜索树python
  • [Redis#7] set | 命令 | 集合 | 用户画像 | UV
  • 【随笔】AI大模型对软件开发的影响
  • 编码器接口测速
  • 宠物领养平台:SpringBoot技术解密
  • 【vue for beginner】Vue该怎么学?
  • 看华为,引入IPD的正确路径
  • 清朗行动再开展,算法安全如何保障
  • springboot+redis+lua实现分布式锁