Java笔试面试题AI答之设计模式(1)

news2024/9/22 0:35:47

文章目录

  • 1. 简述什么是设计模式 ?
  • 2. 叙述常见Java设计模式分类 ?
  • 3. Java 设计模式的六大原则 ?
  • 4. 简述对 MVC 的理解, MVC 有什么优缺点?
      • MVC 的三个核心部分:
      • MVC 的优点:
      • MVC 的缺点:
  • 5. 简述什么是典型的软件三层结构?软件设计为什么要分层?
      • 典型的软件三层结构
      • 软件设计为什么要分层

1. 简述什么是设计模式 ?

设计模式(Design Patterns)是软件工程中一种广泛使用的概念,它代表了在特定上下文中解决常见设计问题的一种典型方式。设计模式是经验的总结,是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是久经考验的,被证明是有效的,并且可以被重复使用。

设计模式通常包含以下几个要素:

  1. 模式名称:一个简洁的、描述性的名字,用于标识设计模式。
  2. 问题:描述了在何种情况下应该使用设计模式,即设计模式的适用场景。
  3. 解决方案:详细描述了设计模式是如何解决问题的,包括类、对象以及它们之间的交互方式。
  4. 效果:描述了使用设计模式后带来的好处和可能引入的副作用。

设计模式主要分为三大类:

  • 创建型模式(Creational Patterns):用于创建对象,特别是使用“工厂方法”模式、“抽象工厂”模式、“单例”模式、“建造者”模式、“原型”模式等,来创建对象实例。
  • 结构型模式(Structural Patterns):用于处理类或对象的组合,如“适配器”模式、“桥接”模式、“组合”模式、“装饰器”模式、“外观”模式、“享元”模式、“代理”模式等,它们通过描述类或对象之间的静态关系来定义系统的结构。
  • 行为型模式(Behavioral Patterns):用于描述类或对象之间如何交互以及职责的分配,如“策略”模式、“模板方法”模式、“观察者”模式、“迭代器”模式、“状态”模式、“职责链”模式、“命令”模式、“访问者”模式、“中介者”模式、“备忘录”模式、“解释器”模式等,它们通过描述类或对象之间的交互和通信来定义系统的行为。

使用设计模式可以帮助开发人员更好地理解、设计和实现软件,提高软件的可维护性、可扩展性和可重用性。同时,设计模式也是软件设计领域的一种交流语言,有助于团队成员之间的沟通和协作。

2. 叙述常见Java设计模式分类 ?

Java设计模式是面向对象程序设计中的一种可复用的解决方案,用于解决软件设计中常见的问题。这些模式在Java社区中非常流行,因为它们提供了一种标准的方式来构建灵活、可维护和可扩展的软件系统。设计模式大致可以分为以下几类:

  1. 创建型模式(Creational Patterns)
    这类设计模式提供了一种在创建对象时隐藏创建逻辑的方式,而不是使用new运算符直接实例化对象。这样可以增加代码的灵活性和可重用性。常见的创建型模式包括:

    • 单例模式(Singleton):确保一个类只有一个实例,并提供一个全局访问点。
    • 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪个类。
    • 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
    • 建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
    • 原型模式(Prototype):通过复制现有的实例来创建新的实例。
  2. 结构型模式(Structural Patterns)
    结构型模式关注于类和对象的组合。它们采用继承以外的方法来组合对象以获得更大的灵活性。结构型模式描述了如何将类或对象结合在一起形成更大的结构,同时保持结构的灵活和高效。常见的结构型模式包括:

    • 适配器模式(Adapter):将一个类的接口转换成客户端所期待的另一种接口形式。
    • 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。
    • 桥接模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
    • 装饰器模式(Decorator):动态地给一个对象添加一些额外的职责。就扩展功能而言,装饰器模式比生成子类更为灵活。
    • 外观模式(Facade):为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
    • 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
    • 享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。
  3. 行为型模式(Behavioral Patterns)
    行为型模式不仅关注类和对象的组织,还关注它们之间的通信。这些模式描述了算法和对象间职责的分配。常见的行为型模式包括:

    • 模板方法模式(Template Method):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
    • 策略模式(Strategy):定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。此模式让算法的变化独立于使用算法的客户。
    • 状态模式(State):允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
    • 观察者模式(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
    • 中介者模式(Mediator):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
    • 迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
    • 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
    • 命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
    • 备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
    • 责任链模式(Chain of Responsibility):为请求的发送者和接收者之间解耦提供了一种松散的耦合方式,使得多个对象都有机会处理这个请求,或者将这个请求传递给链上的下一个对象。
    • 解释器模式(Interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。

这些设计模式在Java及其他面向对象的编程语言中得到了广泛的应用,帮助开发者设计更加灵活、可维护和可扩展的软件系统。

3. Java 设计模式的六大原则 ?

Java 设计模式的六大原则,也被称为面向对象设计原则,是指导我们如何设计可维护、可扩展、可复用的软件系统的基本原则。这些原则帮助开发者在软件设计过程中做出更好的决策,减少设计错误,提高软件质量。以下是六大原则的具体内容:

  1. 单一职责原则(Single Responsibility Principle, SRP)

    • 一个类应该仅有一个引起它变化的原因。即一个类应该负责一组相对独立的功能。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。因此,应当遵守单一职责原则,将类的职责单一化。
  2. 开放-封闭原则(Open-Closed Principle, OCP)

    • 软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。即软件实体在尽量不修改原有代码的基础上进行扩展。实现开放-封闭原则的关键是抽象化,通过抽象化,我们可以将系统的所有可能的行为抽象成一个抽象层,让系统依赖于抽象层,而不是依赖于具体的实现。
  3. 里氏替换原则(Liskov Substitution Principle, LSP)

    • 子类型必须能够替换掉它们的基类型。即所有引用基类的地方必须能透明地使用其子类的对象。这要求子类在扩展父类的功能时,尽量不要改变父类原有方法的预期行为。
  4. 依赖倒置原则(Dependency Inversion Principle, DIP)

    • 高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。即要针对接口编程,不要针对实现编程。依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。
  5. 接口隔离原则(Interface Segregation Principle, ISP)

    • 不应该强迫客户依赖于它们不使用的方法。即一个类对另一个类的依赖应该建立在最小的接口上。接口隔离原则要求我们将臃肿庞大的接口拆分成更小的和更具体的接口,让客户端需要多少接口就依赖多少接口,这样有助于我们构建一个松耦合的系统。
  6. 迪米特法则(Law of Demeter, LoD)

    • 一个软件实体应当尽可能少地与其他实体发生相互作用。即一个对象应该对其他对象保持最少的了解。迪米特法则又称为最少知识原则,它要求我们在设计系统时,应该尽量减少对象之间的交互,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

这六大原则为面向对象设计提供了指导方针,帮助开发者设计出更加健壮、灵活和可维护的软件系统。

4. 简述对 MVC 的理解, MVC 有什么优缺点?

MVC(Model-View-Controller)是一种软件设计典范,用于将应用程序的输入逻辑、处理逻辑和显示逻辑分离,以使得它们能够互相独立地修改和扩展。MVC 模式最早由 Trygve Reenskaug 在1978年提出,被广泛应用于Web开发中,特别是在构建复杂的Web应用程序时。

MVC 的三个核心部分:

  1. Model(模型)

    • 负责管理应用程序的数据以及业务逻辑(如数据验证、计算等)。
    • 模型接收来自视图的数据请求,处理数据后返回结果给视图或控制器。
    • 它是应用程序的核心部分,通常与数据库或其他数据存储进行交互。
  2. View(视图)

    • 负责显示数据给用户。
    • 视图从模型接收数据并生成用户界面,但不包含任何业务逻辑或处理逻辑。
    • 视图通常是由HTML、CSS和JavaScript等技术构建的。
  3. Controller(控制器)

    • 负责接收用户的输入(如点击按钮、提交表单等),并将这些输入转化为对模型和视图的调用。
    • 控制器是模型和视图之间的桥梁,它解释用户的请求,调用模型和视图去完成用户的需求。

MVC 的优点:

  1. 低耦合性:模型、视图和控制器之间的职责清晰分离,减少了系统组件之间的依赖,使得修改和扩展变得容易。
  2. 高内聚性:每个部分都专注于自己的职责,提高了代码的可读性和可维护性。
  3. 易于测试:由于模型和视图的分离,可以更容易地对它们进行单元测试。
  4. 支持并行开发:开发团队可以并行地开发模型、视图和控制器,提高了开发效率。

MVC 的缺点:

  1. 增加系统复杂性:对于小型项目,使用MVC可能会增加不必要的复杂性。
  2. 学习曲线:对于新手来说,理解MVC的概念和如何正确使用它可能需要一些时间。
  3. 调试困难:由于组件之间的交互,当出现问题时,可能需要跨越多个组件进行调试。
  4. 性能考虑:在某些情况下,由于额外的调用和层次,MVC架构可能会影响应用程序的性能。然而,这种影响通常可以通过优化和缓存来减轻。

总的来说,MVC 模式是一种强大的设计模式,它提供了清晰的代码结构,提高了应用程序的可维护性和可扩展性。然而,是否采用MVC模式取决于项目的具体需求和团队的实际情况。

5. 简述什么是典型的软件三层结构?软件设计为什么要分层?

典型的软件三层结构

典型的软件三层结构,也被称为三层架构(3-tier architecture),通常指的是将整个业务应用划分为三个主要层次:

  1. 界面层(User Interface Layer)

    • 主要负责用户界面的展示,包括数据的显示和用户输入的接收。它是用户与系统交互的窗口,位于最外层(最上层),最接近用户。
    • 界面层的设计应尽可能简单,以便用户无需培训即可方便地访问信息。
  2. 业务逻辑层(Business Logic Layer)

    • 也称为应用层或中间件层,是系统架构中体现核心价值的部分。它主要负责业务规则的制定、业务流程的实现等与业务需求相关的逻辑处理。
    • 所有的应用系统、应用逻辑、控制都在这一层,系统的复杂性也主要体现在这一层。
  3. 数据访问层(Data Access Layer)

    • 主要负责数据库的管理,包括数据的存储、检索、更新和删除等操作。所有与数据有关的安全、完整性控制、数据的一致性、并发操作等都在这一层完成。
    • 数据库服务器存储大量的数据信息和数据逻辑,是系统数据的基础。

软件设计为什么要分层

软件设计采用分层架构的原因主要有以下几点:

  1. 降低复杂度:通过将复杂的系统划分为多个更小、更专注的部分,可以显著降低系统的整体复杂度,使得每个层次都有明确的职责,从而更容易理解和维护。

  2. 提高可维护性:分层架构使得修改和扩展系统变得更加容易。如果需要修改某个功能,通常只需要关注并修改相应的层次,而不会影响到其他层次。

  3. 提高可重用性:分层架构有助于提高代码的可重用性。例如,数据访问层的代码可以在多个地方被重用,而不需要每次都编写新的代码。

  4. 提高灵活性:分层架构使得系统更加灵活,能够轻松应对变化。如果需要添加新的功能或修改现有功能,可以通过添加新的层次或修改现有层次来实现。

  5. 促进团队协作:分层架构有助于促进团队成员之间的协作。不同的团队可以专注于不同的层次,从而提高开发效率和质量。

  6. 标准化:通过分层,可以制定标准化的接口和协议,使得不同层次之间的交互更加规范和统一。

  7. 提高安全性:分层架构能够更严格地控制信息访问,通过在数据传输过程中采用数据加密技术,可以进一步降低信息失密的风险。

综上所述,软件设计采用分层架构是为了降低复杂度、提高可维护性、可重用性和灵活性,促进团队协作,实现标准化,并提高系统的安全性。这种设计模式在大型软件开发中尤为重要,能够帮助开发团队更好地应对复杂的业务需求和技术挑战。

答案来自文心一言,仅供参考
在这里插入图片描述

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

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

相关文章

AIGC专栏15——CogVideoX-Fun详解 支持图文生视频 拓展CogVideoX到256~1024任意分辨率生成

AIGC专栏15——CogVideoX-Fun详解 支持图&文生视频 拓展CogVideoX到256~1024任意分辨率生成 学习前言项目特点生成效果相关地址汇总源码下载地址 CogVideoX-Fun详解技术储备Diffusion Transformer (DiT)Stable Diffusion 3EasyAnimate-I2V 算法细节算法组成InPa…

调节 PWM的占空比控制舵机的角度

一、PWM工作原理 让计数器从0数到自动重装载值,不停计数。计数值小于输出比较寄存器时输出一种电平,大于输出比较寄存器时使出另一种电平。 修改定时器时钟源的速度以及预分频器等设置,可以修改计数器计数的速度 再加上修改自动重装载值&…

Spring:统一结果私有属性造成的前端无法访问异常报错问题

用户未填写任何评价 1.问题复现 (1)看一段代码 controller: import lombok.extern.slf4j.Slf4j; import org.ljy.testdemo.common.Result; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.w…

电脑网络怎么弄动态ip :步骤详解与优势探讨

在当今的数字化时代,网络连接已成为我们日常生活和工作中不可或缺的一部分。对于大多数用户而言,动态IP地址是一种便捷且常用的网络配置方式,它允许设备在每次连接到网络时自动获取一个新的IP地址。这种设置不仅简化了网络管理,还…

毕业论文写作3步搞定!分享5款AI写毕业论文的软件

毕业论文写作是一项既重要又具挑战性的任务,尤其对于即将毕业的学生来说。为了帮助大家更高效地完成这一过程,我将分享5款AI写毕业论文的软件,并重点推荐千笔-AIPassPaper。 1. 千笔-AIPassPaper 千笔-AIPassPaper是一款功能强大且全面的AI…

数据集 InterHand2.6M 双手交互 三维手势建模 >> DataBall

数据集 InterHand2.6M 双手交互 三维手势建模 人工智能 深度学习 >> DataBall 数据集 InterHand2.6M,双手/单手交互 ---------------------------------------------------------------------------------------------------------- Train set * Train (H):…

深耕电通二十年,崔光荣升电通中国首席执行官

电通今日宣布,任命拥有二十年深厚电通工作经验的杰出行业领袖崔光(Guang Cui)为电通中国首席执行官,该任命自2024年9月27日起生效。崔光自2004年加入电通以来,从策略规划岗位逐步成长为公司的核心领导者,这也是他职业生涯中的第9次…

MFC -文件类控件

前言 各位师傅大家好,我是qmx_07,今天给大家讲解MFC中的文件类 MFC文件类 在MFC中,CFILE 是基本的文件操作类,提供了读取、写入、打开、关闭等操作方法主要成员函数:Open(用于打开文件,设置模式 例如 只读 只写 读…

EfficientFormer实战:使用EfficientFormerV2实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

深入解析:HTTP 和 HTTPS 的区别

网络安全问题正变得日益重要,而 HTTP 与 HTTPS 对用户数据的保护十分关键。本文将深入探讨这两种协议的特点、工作原理,以及保证数据安全的 HTTPS 为何变得至关重要。 认识 HTTP 与 HTTPS HTTP 的工作原理 HTTP,全称超文本传输协议&#xf…

密码学---常见的其他密码

✨费纳姆密码:加解密都需要密钥,以二进制形式表示的密码。(密钥多是一次性的,称位一次性密码本) 加密过程: char_num {A: 1000001, B: 1000010, C: 1000011, D: 1000100,E: 1000101, F: 1000110, G: 100…

索引设计的5个原则

索引设计的5个原则 💖The Begin💖点点关注,收藏不迷路💖 索引是数据库优化的利器,但设计时要遵循几个核心原则: 高区分度:选择区分度高的列作为索引,避免低区分度列(如性…

基于SpringBoot+Vue的考研百科网站系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 精品专栏:Java精选实战项目源码、Python精…

C#基础(15)选择排序

前言 上一节中我们已经学习了第一个算法:冒泡算法,相信你也有足够的自信继续学习更多的算法。 今天我们就来讲解又一个排序相关的算法:选择排序。 时间复杂度 在进行今天的排序算法讲解之前,我们先补充一个知识点&#xff1a…

借10万块,年化利息明明是3.8%,为啥就变成了2.07%?

今天咱们来聊一聊贷款的奥秘,特别是那个令人爱恨交织的年利率。听起来直观得很,3.8%就像是每年给银行支付贷款总额的3.8%作为利息,但实际上,这里面的学问挺深的。有时候,名义上的3.8%年化,最终一算&#xf…

MATLAB智能优化算法-学习笔记(3)——大规模邻域搜索算法求解旅行商问题【过程+代码】

一、问题描述 旅行商问题(TSP, Traveling Salesman Problem)是组合优化中的经典问题之一。给定一组城市和每对城市之间的距离,要求找到一条最短的路径,使旅行商从某个城市出发,访问每个城市一次并最终回到出发点。TSP问题广泛应用于物流配送、工厂调度、芯片制造等领域。…

RK3588/RK3588s运行yolov8达到27ms

前言 Hello,小伙伴们~~我最近做了一个比较有意思的东西,想起来也好久没有写博客了,就记录一下吧。希望和大家一起学习,一起进步! 我简单介绍一下我最近做的这个东西的经过哈~上个月在B站上看到了一个博主发了一条视频关…

DataGrip远程连接Hive

学会用datagrip远程操作hive 连接前提条件: 注意:mysql是否是开启状态 启动hadoop集群 start-all.sh 1、启动hiveserver2服务 nohup hiveserver2 >> /usr/local/soft/hive-3.1.3/hiveserver2.log 2>&1 & 2、beeline连接 beelin…

上海市高等学校信息技术水平考试 C程序设计(2021A场)全解

2e-1 为 1.0^(-1)*2 在顺序查找法中,如果要从n个学生中找到某个特定的学生信息,最坏的情况是这个学生是最后一个被比较的,这时需要比较n次。但是,如果学生是均匀分布的,那么平均来说,你会在列表的中间找到这…

stm32单片机个人学习笔记5(OLED调试工具)

前言 本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。 STM32入门教程-2023版 细…