深入解析Java设计模式之中介者模式

news2024/9/21 4:33:24

在这里插入图片描述

一、什么是中介者模式

中介者模式(Mediator Pattern)是Java设计模式中的一种行为型模式。在中介者模式中,一个中介者对象封装了一系列对象之间的交互,使对象之间不直接相互通信,而是通过中介者对象进行通信。这种模式有助于降低对象之间的耦合度,使系统更易于维护和扩展。

1.1 中介者模式的主要角色包括:

  1. 中介者(Mediator)

    • 中介者是一个接口或抽象类,定义了对象之间交互的方法。
  2. 具体中介者(Concrete Mediator)

    • 具体中介者是中介者接口的实现,负责协调对象之间的通信。
  3. 同事类(Colleague)

    • 同事类是指需要相互通信的对象,它们通过中介者对象来进行通信。

1.2 中介者模式的优点:

  • 减少类之间的依赖关系:对象不再直接依赖其他对象,而是依赖中介者对象,降低了对象之间的耦合度。
  • 简化对象间的通信:对象之间的通信通过中介者进行,简化了对象之间的交互流程。
  • 集中控制:中介者承担了协调对象之间交互的责任,集中了控制逻辑,使系统更易于管理。

二、中介者模式原理

2.1中介者模式的原理:

  1. 问题背景

    • 在软件开发中,对象之间的直接通信会导致对象之间的耦合度增加,使系统难以维护和扩展。中介者模式通过引入一个中介者对象,将对象之间的通信集中管理,降低对象之间的直接依赖关系,提高系统的灵活性和可维护性。
  2. 核心思想

    • 中介者模式的核心思想是将对象之间的通信行为封装在一个中介者对象中,各个对象不再直接相互通信,而是通过中介者对象来进行通信。这样每个对象只需要和中介者对象进行交互,而不需要了解其他对象的具体实现,从而降低耦合度。
  3. 角色分析

    • 中介者(Mediator):定义一个接口用于与各同事对象通信。
    • 具体中介者(Concrete Mediator):实现中介者接口,负责协调各个同事对象之间的通信。
    • 同事类(Colleague):每个同事类都持有一个中介者对象的引用,通过中介者对象来实现与其他同事对象的通信。
  4. 工作流程

    • 当一个同事对象需要与其他同事对象通信时,它将消息发送给中介者对象。
    • 中介者对象接收到消息后,根据具体的逻辑处理消息,并将消息转发给目标同事对象。
    • 目标同事对象接收到消息后进行相应的处理,完成对象之间的通信。
  5. 优点

    • 降低耦合度:对象之间的通信通过中介者对象进行,减少对象之间的直接依赖关系。
    • 集中控制:中介者负责协调对象之间的通信,集中了控制逻辑,使系统更易于管理。
    • 易于扩展:可以通过扩展中介者来增加新的交互行为,而不需要修改各个同事类。
  6. 适用场景

    • 当对象之间存在复杂的交互关系,且对象之间的耦合度较高时,可以考虑使用中介者模式。
    • 当系统中对象之间的通信逻辑较为复杂,且需要集中管理时,中介者模式也是一种合适的选择。

三、代码实现示例

3.1示例代码:

下面是一个简单的示例代码,演示了中介者模式的基本实现:

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

// 具体中介者实现
class ChatMediatorImpl implements ChatMediator {
    @Override
    public void sendMessage(String message, User user) {
        System.out.println(user.getName() + " sends message: " + message);
    }
}

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

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

    public String getName() {
        return name;
    }

    public void send(String message) {
        mediator.sendMessage(message, this);
    }
}

// 示例代码
public class MediatorPatternExample {
    public static void main(String[] args) {
        ChatMediator mediator = new ChatMediatorImpl();

        User user1 = new User("Alice", mediator);
        User user2 = new User("Bob", mediator);

        user1.send("Hello, Bob!");
        user2.send("Hi, Alice!");
    }
}

在这个示例中:

ChatMediator 接口定义了一个发送消息的方法。
ChatMediatorImpl 是具体的中介者实现,负责处理用户之间的消息传递。
User 类代表聊天室中的用户,每个用户持有一个中介者的引用,通过中介者发送消息。
MediatorPatternExample 类包含了一个简单的示例,创建了一个中介者对象和两个用户对象,然后用户通过中介者发送消息。

四、使用场景

中介者模式在实际项目中有许多应用场景,适用于需要管理对象之间复杂交互关系并降低耦合度的情况。以下是中介者模式在其他场景中的应用示例:

4.1 飞机调度系统

在飞机调度系统中,中介者模式可以用于管理多架飞机之间的通信和协调,避免飞机之间的冲突,确保飞行安全。

4.2 交通信号灯控制系统

在交通信号灯控制系统中,中介者模式可以用于协调不同交通信号灯之间的状态,以及控制车辆的通行顺序,优化交通流量。

4.3 家庭智能设备控制系统

在家庭智能设备控制系统中,中介者模式可以用于管理各种智能设备之间的通信和协作,例如智能灯泡、智能插座、智能门锁等设备之间的联动控制。

4.4 游戏开发中的多人在线游戏

在多人在线游戏中,中介者模式可以用于管理玩家之间的通信和协作,处理游戏事件和交互,确保多人游戏的顺畅进行。

4.5 电商平台订单处理系统

在电商平台的订单处理系统中,中介者模式可以用于协调订单信息的处理和通知,管理订单状态的变化,以及通知相关的用户和系统模块。

4.6 机器人控制系统

在机器人控制系统中,中介者模式可以用于管理各种传感器和执行器之间的通信和控制,协调机器人的动作和反馈。

五、常见问题

5.1 中介者模式与观察者模式有什么区别?

中介者模式(Mediator Pattern)和观察者模式(Observer Pattern)是两种常见的设计模式,它们在实际应用中用于不同的目的,有一些关键区别:

中介者模式(Mediator Pattern):

  1. 目的:

    • 中介者模式的主要目的是降低对象之间的直接耦合度,通过引入中介者对象来集中管理对象之间的通信和交互,从而简化系统设计。
  2. 关注点:

    • 中介者模式关注对象之间的协作行为,中介者负责协调对象之间的交互。
  3. 结构:

    • 中介者模式通常包括一个中介者对象和多个同事类对象,中介者负责管理同事类之间的通信。

观察者模式(Observer Pattern):

  1. 目的:

    • 观察者模式的主要目的是定义对象间的一对多依赖关系,当一个对象的状态发生变化时,其所有依赖对象都会收到通知并自动更新。
  2. 关注点:

    • 观察者模式关注对象的状态变化和通知机制,一个对象(主题或被观察者)维护一组依赖对象(观察者),并在状态变化时通知观察者。
  3. 结构:

    • 观察者模式包括被观察者(主题)和观察者两种角色,被观察者维护观察者列表并在状态变化时通知观察者。

主要区别:

  1. 目的不同:

    • 中介者模式旨在降低对象之间的耦合度,简化对象之间的通信和协作;而观察者模式用于对象之间的一对多依赖关系,当一个对象状态变化时通知其依赖对象。
  2. 关注点不同:

    • 中介者模式关注对象之间的协作行为和通信方式;观察者模式关注对象状态的变化和通知机制。
  3. 结构不同:

    • 中介者模式以中介者对象为中心,管理对象之间的通信;观察者模式以被观察者和观察者为中心,实现状态变化的通知机制。

虽然中介者模式和观察者模式都涉及对象之间的交互和通信,但它们的设计目的和实现方式是不同的,各自适用于不同的场景和问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2042544.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VM——深度学习算子GPU版本耗时不稳定

1、问题:使用3080TI显卡4台130万相机,GPU版本算子,耗时不稳定,15ms-150ms波动 2、方法: 1)参考海康提供的问题手册

Java面试题--JVM大厂篇之JVM 内存管理深度探秘:原理与实战

目录 引言: 正文: 1. JVM内存管理的基本原理 痛点一:频繁的Minor GC 2. 内存分配与回收案例 3. 避免内存泄漏的技巧 痛点二:未关闭的资源 痛点三:静态集合类持有对象引用 4. 优化内存使用的技巧 痛点四:对象过多占用内存…

超越自我——带你学haproxy算法一遍过!!!

文章目录 前言介绍 静态算法static-rrfirst 动态算法roundrobinleastconn 其他算法source算法map-base 取模法一致性hashuriurI_param 取模法hdr 总结本文相关连接如下: 前言 本文相关连接如下: 如果想更多了解haproxy的相关知识,请点击&am…

考试:操作系统知识(03)

分区存储管理 所谓分区存储组织,就是整存,将某进程运行所需的内存整体一起分配给它,然后再执行。有三种分区方式: 固定分区:静态分区方法,将主存分为若干个固定的分区,将要运行的作业装配进去…

ArcGIS Pro 实现人口分布栅格TIFF数据的网格提取与可视化

这里在分享一个人口1km精度栅格数据,LandScan是由美国能源部橡树岭国家实验室(ORNL)提供的全球人口分布数据集,具有最高分辨率的全球人口分布数据,是全球人口数据发布的社会标准,是全球最为准确、可靠&…

架构设计-分层思想

一、为什么要分层设计? 分层设计是为了剥离硬件环境的依赖,使软件系统更好复用,当更换硬件方案时,只需要修改底层函数的初始化,抽象层和服务层完全不需要改动,这样极大的减小时间成本,平台能够很…

前后端分离项目实战-通用管理系统搭建(前端Vue3+ElementPlus,后端Springboot+Mysql+Redis)第二篇:项目登录功能的实现

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

Element UI左侧导航栏写法(递归组件实现)

1、左侧导航栏组件使用的是Element Ui的导航栏组件,思路:首先判断导航栏数据是否存在children,以此来实现一级菜单与多级菜单的渲染,然后使用递归组件实现多级菜单的子菜单渲染,注意使用递归组件需将菜单栏数据在父组件…

SQL— DDL语句学习【后端 10】

SQL— DDL语句学习 在数据管理的广阔领域中,SQL(Structured Query Language)作为操作关系型数据库的编程语言,扮演着举足轻重的角色。它不仅定义了操作所有关系型数据库的统一标准,还为我们提供了强大的工具来管理、查…

TypeScript教程(四)type、interface、类型断言、非空断言

上一章我们讲解了Typescript的基础类型,接下来我们就来看看Typescript的、type、interface、类型断言、非空断言 type关键字(类型别名) type 关键字可以帮助我们为现有的类型创建别名,提高代码的可读性和可维护性 在前面,我们通过在类型注解…

一切计算皆AI,开放计算再破局

“OpenAI最差的决定就是没有开放它的大模型。”著名科技预言家凯文凯利在2024年最新演讲中强调开源对于AI发展的重要性。 的确,开源大模型近年来迸发出巨大的产业活力,推动了AI的协作与创新:2023年全球新发布的基础模型中有三分之二为开源模…

随笔二、OV5695摄像头测试

摘要:泰山派开发板SDK使用了GStreamer媒体框架作为音视频的编解码器,支持硬件编解码。开发板提供MIPI_CSI摄像头接口连接摄像头。 1. 摄像头信息 开发板MIPI-CPI接口是30pin、4lane;测试用的OV5696是2lane,像素500万,…

GPU云服务器有什么优点?

云服务器是一种通过互联网提供计算资源和服务的灵活、高性能的解决方案。而随着人工智能及数据密集型应用的迅猛发展,GPU(图形处理器)云服务器逐渐成为许多企业和个人的优选。下面将介绍GPU云服务器的几个优势。 1、GPU云服务器具备强大的计算…

线程的退出

线程退出方式总结&#xff1a; 1.pthread_exit; void pthread_exit(void *retval); 传的是退出状态值对应的地址 2.执行函数中return 3.pthread_cancel // int pthread_cancel(pthread_t thread); 4.在任何一个线程中调用了exit #include <stdio.h> #include <…

软件测试之Linux系统性能调优技巧

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言 Linux系统性能调优是一项复杂且系统性的任务&#xff0c;它涉及操作系统内核、硬件资源、应用程序、文件系统、网络设置等多个方面。通过合理的调优策略&#xff0c;可以有效提高Linux系统的性能&#xff0c;满足生产环境…

qt-10基本对话框(文件--颜色--字体)

基本对话框--输入对话框 DialogDialog.hDialog.cpp exdialog.hexdialog.hexdialog.cpp 运行图文件对话框颜色对话框字体对话框输入对话框-字符串输入对话框-选择 Item输入对话框-数字 Dialog Dialog.h #ifndef DIALOG_H #define DIALOG_H#include "exdialog.h"#inc…

数字文创产业园怎么凭借智慧园区建设出圈

在数字化浪潮席卷全球的当下&#xff0c;数字文创产业正以前所未有的速度崛起。而数字文创产业园若想在众多竞争对手中脱颖而出&#xff0c;凭借智慧园区建设出圈无疑是一条明智之路。 首先得明白什么是智慧园区建设&#xff1f; 智慧园区建设指的是通过现代信息技术和智能化手…

超时控制+第三方调用控制

文章目录 第三方调用控制背景介绍一致性抽象同步转异步自动替换第三方压测支持 超时控制目标确定超时时间根据用户体验根据响应时间压力测试根据代码计算 监控超时时间 第三方调用控制 背景介绍 我的系统对可用性要求非常高&#xff0c;为此我综合使用了熔断、限流、降级、超…

mac 链接数据库报错 - Public Key Retrieval is not allowed

使用 DBeaver 链接 MySQL 时&#xff0c;连接失败&#xff0c;提示 Public Key Retrieval is not allowed 发现是需要修改一个链接属性字段&#xff0c;方式如下&#xff1a; 1、选中服务器&#xff0c;点击 编辑连接 2、连接设置 – 驱动属性 – allowPublicKeyRetrieval 改为…