Java二十三种设计模式-中介者模式(22/23)

news2024/11/12 18:24:24

本文深入探讨了中介者模式,这是一种行为型设计模式,通过定义一个中介者对象来简化对象间的通信,降低耦合度,并提高系统的模块化,同时提供了实现示例、使用场景、优缺点分析、与其他设计模式的比较,以及最佳实践和替代方案。

中介者模式:简化对象间通信的中心化设计

引言

中介者模式(Mediator Pattern)是一种行为型设计模式,用于定义一个中介者对象来简化对象间的通信。中介者使对象之间不再显示地相互引用,从而使耦合度降低。

基础知识,java设计模式总体来说设计模式分为三大类:

(1)创建型模式,共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

(2)结构型模式,共7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

(3)行为型模式,共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

第一部分:中介者模式概述

1.1 定义与用途

中介者模式的基本定义: 中介者模式是一种行为型设计模式,它通过引入一个中介者对象来封装一系列对象之间的交互,从而实现对象间的解耦。

为何需要中介者模式:

  • 降低耦合度:中介者模式减少了对象之间的直接交互,降低了系统各部分之间的耦合度。
  • 集中管理交互:提供了一个集中的地方来管理对象间的通信逻辑,简化了复杂系统的设计。
  • 易于扩展和维护:当需要增加新的交互逻辑或对象时,可以不必修改已有对象,只需扩展中介者。

1.2 中介者模式的组成

中介者(Mediator)

  • 定义:中介者定义了同事对象之间的通信方式,通常包含同事对象的引用和相关的方法。

同事对象(Colleague)

  • 定义:同事对象是中介者模式中的各个对象,它们通过中介者来进行通信,而不是直接与其他同事对象交互。

角色之间的交互

  • 通信:同事对象通过调用中介者的方法来实现交互,而不是直接调用其他同事对象的方法。
  • 集中控制:中介者作为中心节点,控制和协调各个同事对象之间的交互。

中介者模式通过集中管理对象间的交互,简化了对象间的通信机制,提高了系统的灵活性和可维护性。在下一部分中,我们将通过Java代码示例来展示中介者模式的具体实现。

第二部分:中介者模式的实现

2.1 Java实现示例

以下是使用Java语言实现中介者模式的代码示例。在这个例子中,我们创建了一个简单的聊天室系统,用户(同事对象)通过聊天室(中介者)来互相通信。

// 同事对象接口
interface Colleague {
    void receive(String message);
    void setMediator(Mediator mediator);
}

// 具体同事对象:用户
class User implements Colleague {
    private String name;
    private Mediator mediator;

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

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

    @Override
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

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

// 中介者接口
interface Mediator {
    void register(Colleague colleague);
    void relay(Colleague sender, String message);
}

// 具体中介者:聊天室
class ChatRoom implements Mediator {
    private List<Colleague> colleagues = new ArrayList<>();

    @Override
    public void register(Colleague colleague) {
        colleagues.add(colleague);
    }

    @Override
    public void relay(Colleague sender, String message) {
        for (Colleague colleague : colleagues) {
            if (colleague != sender) {
                colleague.receive("From " + sender.name + ": " + message);
            }
        }
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Mediator mediator = new ChatRoom();
        Colleague user1 = new User("User1");
        Colleague user2 = new User("User2");

        user1.setMediator(mediator);
        user2.setMediator(mediator);
        mediator.register(user1);
        mediator.register(user2);

        user1.send("Hello User2!");
        user2.send("Hi User1!");
    }
}

2.2 中介者模式中的角色和职责

中介者(Mediator)

  • 职责:中介者负责协调和管理同事对象之间的交互,提供方法让同事对象注册和通信。

同事对象(Colleague)

  • 职责:同事对象负责实现自己的业务逻辑,并通过中介者与其他同事对象通信。

角色之间的相互作用

  • 注册:同事对象在创建后需要注册到中介者,以便中介者可以管理它们。
  • 通信:当同事对象需要与其他同事对象通信时,它会通过中介者来转发消息。
  • 消息传递:中介者接收到消息后,根据注册的同事对象列表来分发消息。

中介者模式通过集中管理对象间的交互,简化了对象间的通信机制,提高了系统的灵活性和可维护性。在下一部分中,我们将探讨中介者模式的使用场景。

第三部分:中介者模式的使用场景

3.1 对象间存在复杂交互的场景

在软件系统中,当多个对象需要进行频繁的通信和交互时,这些交互可能会变得复杂和难以管理。例如,在图形用户界面(GUI)编程中,多个组件(如按钮、文本框、菜单等)需要相互响应事件。如果没有一个统一的协调机制,组件之间的依赖关系将变得错综复杂,导致代码难以维护和扩展。

中介者模式的应用

  • 解耦组件:中介者模式允许将组件的交互逻辑从组件本身中分离出来,由中介者统一管理。这样,组件之间不需要直接引用对方,而是通过中介者进行通信,降低了它们之间的耦合度。
  • 简化组件设计:组件可以专注于自己的功能实现,而不必关心其他组件的状态和行为。这使得组件的设计更加简洁和清晰。
  • 提高代码可维护性:当需要修改交互逻辑时,开发者只需在中介者中进行修改,而不需要触及各个组件的代码。这大大提高了代码的可维护性。
示例:

假设在一个聊天应用中,用户界面中有多个组件,如消息输入框、发送按钮、消息列表等。使用中介者模式,这些组件可以通过一个中介者对象来协调它们的交互,如发送消息、接收消息等事件。这样,当需要添加新的消息类型或交互逻辑时,只需在中介者中进行扩展,而不必修改现有的组件代码。

3.2 需要集中管理对象交互的场景

在一些系统中,对象之间的交互可能需要集中管理和控制,以保证交互的一致性和正确性。例如,在企业应用中,不同的业务模块(如订单管理、库存管理、客户关系管理等)可能需要协同工作,而这些模块之间的交互可能非常复杂。

中介者模式的优势

  • 集中管理交互:中介者模式提供了一个集中的交互管理点,可以统一处理对象之间的通信,确保交互的一致性和正确性。
  • 提高系统可扩展性:当系统需要扩展新的功能或模块时,可以通过在中介者中添加新的交互逻辑来实现,而不需要修改现有的模块代码。
  • 简化跨模块通信:中介者模式简化了跨模块的通信过程,模块之间不需要直接交互,而是通过中介者来进行,这降低了模块之间的依赖关系。
示例:

在一个电子商务平台中,订单处理、支付处理、库存管理和物流管理等多个模块需要协同工作。使用中介者模式,可以创建一个中介者来协调这些模块之间的交互,如订单状态更新、支付确认、库存扣减等。这样,当平台需要添加新的支付方式或物流服务时,只需在中介者中进行相应的扩展,而不会影响到现有的业务模块。

通过上述分析,我们可以看到中介者模式在处理对象间复杂交互和需要集中管理交互的场景中具有明显的优势。它通过降低对象之间的耦合度、简化交互逻辑的管理和提高系统的可维护性和可扩展性,为构建大型、复杂的软件系统提供了有效的解决方案。

第四部分:中介者模式的优点与缺点

4.1 优点

中介者模式提供了多种优点,使其成为解决特定设计问题的有效工具。

  • 降低耦合度:中介者模式通过引入一个中介者对象来封装对象间的交互,从而减少了对象之间的直接依赖。对象不再需要了解其他对象的实现细节,只需要与中介者通信。

  • 提高模块化:由于对象间的交互被集中管理,系统的各个部分变得更加模块化。这使得代码更容易理解和维护,同时也便于单独更新或替换系统中的某个部分。

  • 增强可维护性:当系统中的交互逻辑需要更新时,开发者只需修改中介者对象,而不必修改所有相互交互的同事对象。这大大减少了维护成本。

  • 易于扩展:添加新的同事对象变得简单,因为新对象只需要遵循中介者定义的接口与中介者通信,无需修改现有同事对象的代码。

  • 集中控制:中介者可以控制同事对象的交互方式,这为系统提供了集中的控制点,有助于实现复杂的交互逻辑。

  • 简化对象协议:中介者模式允许开发者定义统一的通信协议,简化了同事对象之间的通信机制。

4.2 缺点

尽管中介者模式提供了多种优点,但它也存在一些潜在的缺点。

  • 中介者对象可能过于复杂:随着系统的发展,中介者对象可能会变得非常复杂,因为它需要处理所有同事对象之间的交互。这可能导致中介者难以理解和维护。

  • 性能问题:如果中介者对象变得过于庞大,它可能会成为系统的性能瓶颈,尤其是在处理大量交互时。

  • 降低了系统的灵活性:由于所有交互都通过中介者进行,这可能会在某种程度上降低系统的灵活性。对中介者的任何更改都可能影响到所有的同事对象。

  • 可能隐藏设计问题:中介者模式有时可能被用来解决设计不当的问题,如过度的类间通信,而不是去重新设计一个更合理的对象结构。

  • 单点故障:中介者对象成为所有通信的核心,如果它出现故障,可能会影响到系统中的所有同事对象。

  • 测试困难:由于中介者对象与多个同事对象紧密耦合,编写单元测试可能变得更加困难,需要更多的测试工具和模拟对象。

综上所述,中介者模式是一个强大的设计模式,可以有效地简化对象间的通信并降低系统的耦合度。然而,开发者需要谨慎使用,以避免中介者对象变得过于复杂和难以管理。在设计时,应该权衡中介者模式的优缺点,并考虑它是否适合解决特定的设计问题。

第五部分:中介者模式与其他模式的比较

5.1 与观察者模式的比较

观察者模式是一种对象行为模式,其中一个对象(称为主题)的状态改变会通知所有依赖于它的对象(称为观察者)。这种模式非常适合于实现分布式事件处理系统,其中事件的发布者和订阅者之间存在一对多的关系。

  • 通信方向:观察者模式是单向通信,主题到观察者。
  • 耦合度:观察者模式中,观察者和主题之间的耦合度相对较低,因为它们通过接口而不是具体类进行交互。
  • 应用场景:适用于事件驱动的系统,如用户界面事件处理。

中介者模式则提供了一个中介者对象来封装一系列对象之间的交互。这种模式适用于对象之间的多对多通信,其中对象之间的交互非常频繁且复杂。

  • 通信方向:中介者模式可以支持双向或多向通信。
  • 耦合度:中介者模式中,对象之间的耦合度更低,因为它们不直接相互引用,而是通过中介者进行通信。
  • 应用场景:适用于需要集中管理复杂交互的系统,如UI组件之间的协调。

5.2 与命令模式的对比

命令模式是一种行为模式,它将请求或操作封装为一个对象,从而允许用户使用不同的请求、队列或日志请求来参数化其他对象,并支持可撤销的操作。

  • 请求封装:命令模式侧重于将请求封装为对象,这有助于实现延迟执行、事务处理等。
  • 解耦:命令模式通过将调用者和接收者解耦,提高了系统的灵活性。
  • 应用场景:适用于需要对操作进行封装、记录、排队或撤销的系统,如事务处理系统。

相比之下,中介者模式关注于简化对象之间的交互和通信。

  • 通信协调:中介者模式通过一个中介者对象来协调多个对象之间的通信。
  • 集中管理:中介者模式提供了一个集中的通信管理点,有助于简化复杂的交互逻辑。
  • 应用场景:适用于对象之间存在复杂交互,需要集中管理以降低耦合度的系统。

总结

中介者模式、观察者模式和命令模式都是行为型设计模式,它们各自解决不同的设计问题:

  • 中介者模式:适合于多对多通信,需要集中管理交互的场景。
  • 观察者模式:适合于一对多通信,事件驱动的场景。
  • 命令模式:适合于请求的封装和解耦,需要支持操作的撤销或重做的系统。

在选择设计模式时,理解每种模式的核心特点和适用场景是非常重要的。这有助于开发者做出合理的设计决策,创建出既灵活又可维护的系统。

第六部分:中介者模式的最佳实践和建议

6.1 最佳实践

保持中介者职责单一
  • 单一职责原则:确保中介者对象遵循单一职责原则,只处理与对象间通信相关的逻辑。
  • 避免功能膨胀:随着系统的发展,避免不断向中介者添加新的职责,这可能导致其变得臃肿和难以管理。
使用中介者进行解耦
  • 明确解耦目标:使用中介者模式明确地解耦系统中的组件,减少它们之间的直接依赖。
  • 促进模块化:通过中介者模式,促进系统的模块化设计,使各个模块更加独立和可重用。

6.2 避免滥用

避免过度中心化
  • 适度使用:避免过度依赖中介者进行所有通信,这可能导致中介者成为系统的性能瓶颈和单点故障。
  • 分散责任:在适当的情况下,考虑将一些职责下放给各个组件,以分散中介者的责任。
考虑使用其他模式
  • 评估适用性:在设计初期,评估中介者模式是否是解决通信问题的最佳方案,或者是否有更适合的设计模式。
  • 灵活选择:根据具体场景灵活选择观察者模式、命令模式或其他模式,以满足特定的设计需求。

6.3 替代方案

使用事件总线
  • 解耦通信:事件总线提供了一种发布-订阅模式,允许对象在不直接引用对方的情况下进行通信。
  • 灵活性:事件总线提供了高度的灵活性,组件可以动态地订阅或退订事件,而无需修改中介者。
其他替代方案
  • 直接通信:在对象数量较少且关系固定的情况下,可以考虑使用直接通信,避免引入中介者。
  • 依赖注入:通过依赖注入减少对象之间的耦合,同时保持它们的独立性。
  • 服务定位器模式:使用服务定位器来管理对象之间的依赖关系,提供一种查找服务的机制。

结语

中介者模式是一种强大的设计模式,可以有效地简化复杂的对象间通信。然而,为了充分利用中介者模式的优势,开发者需要遵循最佳实践,避免滥用,并根据具体情况考虑替代方案。通过合理地应用中介者模式,可以创建出低耦合、高内聚、易于维护和扩展的系统。同时,保持对设计模式的深入理解和灵活运用,是成为一名优秀软件设计师的关键。

结语

中介者模式提供了一种有效的方式来简化对象间的通信,降低系统的耦合度。通过本文的深入分析,希望读者能够对中介者模式有更全面的理解,并在实际开发中做出合理的设计选择。

中介者模式是一种强大的设计模式,它通过中心化对象间的通信来简化复杂的交互。通过本文的深入分析,我们希望读者能够对中介者模式有更全面的理解,并在实际开发中做出合理的设计选择。记住,合理运用设计模式可以显著提升软件的质量和可维护性,但每种模式都有其适用场景和限制,合理选择和应用是关键。


博主还写了其他Java设计模式关联文章,请各位大佬批评指正:

(一)创建型模式(5种):

Java二十三种设计模式-单例模式(1/23)

Java二十三种设计模式-工厂方法模式(2/23)

Java二十三种设计模式-抽象工厂模式(3/23)

Java二十三种设计模式-建造者模式(4/23)

Java二十三种设计模式-原型模式(5/23)

(二)结构型模式(7种): 

Java二十三种设计模式-适配器模式(6/23)

Java二十三种设计模式-装饰器模式(7/23)

Java二十三种设计模式-代理模式(8/23)

Java二十三种设计模式-外观模式(9/23)

Java二十三种设计模式-桥接模式(10/23)

Java二十三种设计模式-组合模式(11/23)

Java二十三种设计模式-享元模式(12/23)

 (三)行为型模式(11种): 

Java二十三种设计模式-策略模式(13/23)

Java二十三种设计模式-模板方法模式(14/23)

Java二十三种设计模式-观察者模式(15/23)

Java二十三种设计模式-迭代子模式(16/23)

Java二十三种设计模式-责任链模式(17/23)

Java二十三种设计模式-命令模式(18/23)

Java二十三种设计模式-备忘录模式(19/23)

Java二十三种设计模式-状态模式(20/23)

Java二十三种设计模式-访问者模式(21/23) 

​欲知后事如何,且看下文分解...... ​

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

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

相关文章

贪心算法,暴力递归

前缀树 如果想要查询“bc”就可以直接看有没有走向b的路&#xff0c;如果有的话就看c节点上面的e值为1那么就是有这个“bc”&#xff0c;还能看见加过几次&#xff0c;代价很低 如果想看有多少是以“ab”作为前缀的&#xff0c;那么就直接看b上面的p值 贪心算法 哪个会议结束时…

java中final的使用方法

package Test;/*** author gyf* ClassName Test* Date 2024/8/13 16:26* Version V1.0* Description :*/ public class Test {public static void main(String[] args) {// 被final修饰就不能修改变量了final int a 10;System.out.println(a);} } // 若父类用final 修饰 则子类…

基于Java和GeoTools的Shapefile矢量数据缩略图生成实践

目录 前言 一、关于GeoTools的图片生成 1、关于GtRenderer 2、关于 图像生成架构 3、流式计算绘制 二、全球空间预览生成实战 1、pom.xml中关于图像生成依赖 2、样式设置及地图资源绑定 3、图片生成绘制 4、图片生成测试 三、成果验证 1、全球范围生成 2、我国的范…

快速批量替换图片名称为指定名称(附代码)

目录 一、需求二、代码使用方法三、代码四、效果展示 一、需求 深度学习配对训练&#xff0c;有时配对图像的名称需要一致&#xff0c;这里写了一个脚本&#xff0c;快速批量替换图片名称中某些字符串。 二、代码使用方法 使用代码时需要修改的地方见下&#xff1a; 三、代码…

一文1600字从0到1JMeter全流程性能测试实战!

项目背景&#xff1a; 我们的平台为全国某行业监控平台&#xff0c;经过3轮功能测试、接口测试后&#xff0c;98%的问题已经关闭&#xff0c;决定对省平台向全国平台上传数据的接口进行性能测试。 01、测试步骤 1、编写性能测试方案 由于我是刚进入此项目组不久&#xff0c…

[HGAME 2023 week1]Classic Childhood Game

方法一&#xff1a;在控制台输入mota&#xff08;&#xff09; 方法二&#xff1a;查看页面源码发现多个js,一一查看 在./Res/Events.js中发现编码&#xff08;准确来说是字符串&#xff09; \x59\x55\x64\x6b\x61\x47\x4a\x58\x56\x6a\x64\x61\x62\x46\x5a\x31\x59\x6d\x35\x7…

基于MATLAB视觉的静态手势识别系统

一、课题介绍及思路 为了丰富手势识别方法的多样性&#xff0c;提高手势识别的正确率&#xff0c;提出了一种基于手势轮廓像素变化的手势识别方法。在Matlab环境下&#xff0c;设计并开发了一个基于视觉的静态手势识别系统。系统主要由两部分组成&#xff1a;手势分割与手势识…

八股总结----数据库(MySQL和Redis)

1.MySQL部分 11.基本写法 列出数据库&#xff1a;show databases&#xff1b;创建数据库&#xff1a;create database mysql_test&#xff1b;切换数据库&#xff1a;use mysql_test&#xff1b;列出表&#xff1a;show tables&#xff1b;创建表&#xff1a;create table st…

回归预测|基于最大互信息与支持向量机结合的数据回归预测Matlab程序MIC-SVM 多特征输入单输出

回归预测|基于最大互信息与支持向量机结合的数据回归预测Matlab程序MIC-SVM 多特征输入单输出 文章目录 前言回归预测|基于最大互信息与支持向量机结合的数据回归预测Matlab程序MIC-SVM 多特征输入单输出 一、MIC-SVM模型最大信息系数&#xff08;MIC&#xff09;的原理支持向量…

网路安全-防火墙安全区域简介

文章目录 1. 概念介绍1.1 什么是安全区域&#xff1f;1.2 安全区域的分类1.3 安全区域级别1.4 安全区域的作用是什么&#xff1f; 2. 实战2.1 ENSP实验设计1实验目标&#xff1a;实验步骤&#xff1a; 2.2 ENSP实验设计2实验目标&#xff1a;实验步骤&#xff1a; 2.3 实验总结…

线性表【双向循环链表基本定义与操作】(带头结点)

1.双向循环链表的特征与图解 让头结点的 前驱指针 指向 链表的最后一个结点让 最后一个结点 的后继指针 指向 头结点。 2.双向循环链表的重要操作 1.双向循环链表的结构定义 双向循环链表的结构与双向链表完全一致&#xff0c;不同之处在于它的尾结点的next指针指向头结点&am…

【Docker深入浅出】【四】单体应用容器化与Dockerfile怎么写

文章目录 一. 应用的容器化——简介二. 单体应用容器化1. 获取代码与分析Dockfile2. 容器化当前应用&#xff08;构建具体的镜像&#xff09;3&#xff0e;推送镜像到仓库4. 运行应用程序5. 小结 三. 生产环境中的多阶段构建四. 应用容器化命令 本文介绍了如何容器化&#xff0…

springboot的学习(三):开发相关

简介 一些开发测试时用到的技术。 springboot 热部署 修改了代码&#xff0c;服务器不需要重启可以直接看到新的修改的效果。仅仅加载当前开发者自定义开发的资源&#xff0c;不加载jar资源。 在pom.xml配置文件中添加&#xff1a; <dependency><groupId>org.s…

AI可以写毕业论文吗?6款亲测好用人工智能写论文网站

AI写作工具在学术界的应用已经逐渐成为一种趋势&#xff0c;特别是在毕业论文的撰写过程中。这些工具不仅能够提高写作效率&#xff0c;还能帮助学生更好地组织和规划他们的研究内容。以下是六款经过亲测且好用的人工智能写论文网站推荐&#xff1a; 一、千笔-AIPassPaper 千笔…

【自动驾驶】控制算法(三)轮胎侧偏与车辆动力学模型

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

苍鹰来啦!快来看呀!NGO-BiTCN-BiGRU-Attention北方苍鹰算法优化多重双向深度学习回归预测

苍鹰来啦!快来看呀&#xff01;NGO-BiTCN-BiGRU-Attention北方苍鹰算法优化多重双向深度学习回归预测 目录 苍鹰来啦!快来看呀&#xff01;NGO-BiTCN-BiGRU-Attention北方苍鹰算法优化多重双向深度学习回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实…

Java实现MQTT通信(发布订阅消息)

文章目录 前言一、相关pom依赖二、相关代码1.MQTT工具类2.MQTT回调函数3.订阅消息4.发布消息 三、安装mosquitto1.mosquitto简介2.下载 四、安装MQTT.fx1.MQTT.fx简介2.下载3.使用 五、java订阅消息六、java发布消息 前言 MQTT是一种轻量级的物联网通信协议&#xff0c;基于客…

[Meachines] [Easy] Blue MS17-010永恒之蓝

信息收集 IP AddressOpening Ports10.10.10.40TCP:135/tcp msrpc, 139/tcp netbios-ssn, 445/tcp microsoft-ds, 49152/tcp msrpc, 49153/tcp msrpc, 49154/tcp msrpc, 49155/tcp msrpc, 49156/tcp msrpc, 49157/tcp msrpc $ nmap -p- 10.10.10.40 --min-rate 1000 -sC -sV …

YOLOV8 POSE姿态检测对图片绘制矩形和和关节点序号

代码如下 import cv2 import torchfrom ultralytics import YOLO# Load a model # model YOLO("yolov8n-pose.yaml") # build a new model from YAML model YOLO("yolov8n-pose.pt") # load a pretrained model (recommended for training) # model …

SQL— DQL语句学习【后端 11】

DQL语句 引言 DQL&#xff08;Data Query Language&#xff0c;即数据查询语言&#xff09;是SQL&#xff08;Structured Query Language&#xff09;中用于从数据库中检索数据的重要部分。在数据库管理中&#xff0c;DQL语句是日常工作中最常用的工具之一。通过DQL&#xff0…