深究设计模式之-中介者模式

中介者模式(Mediator Pattern)是一种行为型设计模式,其主要目的是定义一个中介对象,用于封装一组对象之间的交互关系,从而使这些对象之间不直接相互通信,而是通过中介者对象进行通信。中介者模式可以减少对象之间的直接依赖关系,提高系统的灵活性和可维护性。

假设我们有一个聊天室 应用程序,其中有多个用户可以发送消息。如果没有中介者模式,每个用户都需要知道其他用户的存在,并且要直接发送消息给每个用户。但通过中介者模式,每个用户只需将消息发送给聊天室中介者 ,然后中介者负责将消息传递给所有其他用户。这样一来,用户之间不需要直接通信,而是通过中介者进行通信,这样就解耦了用户之间的关系,使得系统更灵活和可扩展。

主要角色:

  1. 中介者(Mediator): 定义了一个接口用于与各同事对象通信。
  2. 具体中介者(Concrete Mediator): 实现了中介者接口,负责协调各同事对象的交互关系。
  3. 用户类(User): 每个用户类都知道中介者对象,与其他用户通过中介者进行通信。

示例:

用java实现一下这个聊天室的例子,多个用户在聊天室中进行消息交流,中介者(聊天室)负责协调用户之间的消息传递。

java 复制代码
package com.luke.designpatterns.mediatorPattern;

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

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

// 具体中介者实现
class ChatMediatorImpl implements ChatMediator {
    private List<User> users;

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

    @Override
    public void sendMessage(String message, User user) {
        for (User u : users) {
            // 确保消息不发送给发送者自身
            if (u != user) {
                u.receiveMessage(message);
            }
        }
    }

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

// 用户类
class User {
    private String name;
    private ChatMediator mediator;

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

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

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

// 测试中介者模式
public class MediatorPatternExample {
    public static void main(String[] args) {
        ChatMediator mediator = new ChatMediatorImpl();

        User user1 = new User("User1", mediator);
        User user2 = new User("User2", mediator);
        User user3 = new User("User3", mediator);

        mediator.addUser(user1);
        mediator.addUser(user2);
        mediator.addUser(user3);

        user1.sendMessage("各位好啊!");
        user2.sendMessage("你好!");
        user3.sendMessage("大家好!");

    }
}

在这个例子中,ChatMediator 接口定义了中介者的行为,ChatMediatorImpl 实现了具体的中介者逻辑。User 类表示聊天室中的用户,它们通过中介者对象来发送和接收消息。在测试中,我们创建了一个中介者和三个用户,然后通过中介者来发送消息,确保消息被正确地传递给其他用户。客户端代码创建了一个聊天室作为中介者,并创建了多个用户作为同事对象,通过中介者进行消息的传递。中介者模式使得用户之间的消息传递变得松耦合,用户不直接依赖于其他用户,而是通过中介者进行通信。这样,在聊天室中增加新的用户或改变用户之间的交互方式都变得更加容易。

适用场景

中介者模式比较适用的场景如下:

  1. 图形用户界面(GUI)框架: 在GUI框架中,各个组件(如按钮、文本框等)之间的交互可以通过中介者模式进行管理。中介者负责处理用户输入、更新组件状态,并确保各组件之间的协调工作,从而简化了组件间的直接通信。
  2. 航空交通管制系统: 在航空交通管制系统中,飞机、塔台、雷达等都可以作为对象,而中介者则可以是空中交通管制中心。中介者模式有助于协调和调度飞机的起降,避免直接的飞机间通信,提高了整个系统的可维护性和可扩展性。
  3. 多人在线游戏: 在游戏中,玩家、敌对NPC、任务系统等可以作为对象,而中介者则可以是游戏服务器。通过中介者模式,玩家之间的互动和事件的处理可以更好地组织,降低了游戏系统的复杂性。
  4. 金融交易系统: 在金融领域中,交易系统中的不同组件,如交易引擎、账户管理等,可以通过中介者模式协调彼此之间的交互。这有助于确保交易的一致性和可靠性,同时提高了系统的可维护性。
相关推荐
小兔子6 分钟前
os.path.join 遇到绝对路径会丢掉前面所有段,这条规则写在文档第二句
后端
小兔子9 分钟前
Go 的接口是类型加值,所以赋了 nil 的 err 判断起来不等于 nil
后端
不一样的少年_9 分钟前
不花一分额外 API 钱,用现成的 Claude Code / Codex / Cursor 搭建 AI 个人知识库
前端·后端·ai编程
用户69190268133910 分钟前
Redis 1:简述Redis概念与Agent的联系
redis·后端·设计
艾思控驱动器12 分钟前
手写一个电流环采样时序校核工具:为什么你的 FOC 电流总差几个百分点
后端
揣一尾游鱼yu12 分钟前
内部类和Object笔记
java·开发语言·object·内部类
智驭未来掌门人13 分钟前
桌面程序里的“1K 以内”:到底该限制哪一层像素(C++ Qt 版)
后端
reesun15 分钟前
分层干不干净,要等你想换掉一层才见分晓:DuckDB 2.0 换掉 parser 靠的那道缝
后端
逸风尊者35 分钟前
智能调度系统从0到1:系统架构设计方法
后端
你怎么知道我是队长1 小时前
C++零基础第3周:if/else、switch、for/while/do-while 控制流完全指南(附20段可运行代码+避坑清单)
java·开发语言·c++