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

中介者模式(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. 金融交易系统: 在金融领域中,交易系统中的不同组件,如交易引擎、账户管理等,可以通过中介者模式协调彼此之间的交互。这有助于确保交易的一致性和可靠性,同时提高了系统的可维护性。
相关推荐
坊钰14 分钟前
【Java 数据结构】移除链表元素
java·开发语言·数据结构·学习·链表
chenziang119 分钟前
leetcode hot100 LRU缓存
java·开发语言
会说法语的猪24 分钟前
springboot实现图片上传、下载功能
java·spring boot·后端
码农老起25 分钟前
IntelliJ IDEA 基本使用教程及Spring Boot项目搭建实战
java·ide·intellij-idea
m0_7482398329 分钟前
基于web的音乐网站(Java+SpringBoot+Mysql)
java·前端·spring boot
时雨h34 分钟前
RuoYi-ue前端分离版部署流程
java·开发语言·前端
凡人的AI工具箱34 分钟前
每天40分玩转Django:实操多语言博客
人工智能·后端·python·django·sqlite
Cachel wood1 小时前
Django REST framework (DRF)中的api_view和APIView权限控制
javascript·vue.js·后端·python·ui·django·前端框架
麒麟而非淇淋1 小时前
Day13 苍穹外卖项目 工作台功能实现、Apache POI、导出数据到Excel表格
java