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

文章目录

  • 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.mzph.cn/web/53559.shtml

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

相关文章

巨潮股票爬虫逆向

目标网站 aHR0cDovL3dlYmFwaS5jbmluZm8uY29tLmNuLyMvSVBPTGlzdD9tYXJrZXQ9c3o 一、抓包分析 请求头参数加密 二、逆向分析 下xhr断点 参数生成位置 发现是AES加密,不过是混淆的,但并不影响咱们扣代码 文章仅提供技术交流学习,不可对目标服…

LabVIEW提高开发效率技巧----合理使用数据流与内存管理

理使用数据流和内存管理是LabVIEW开发中提高性能和稳定性的关键,特别是在处理大数据或高频率信号时,优化可以避免内存消耗过大、程序卡顿甚至崩溃。 1. 使用 Shift Register 进行内存管理 Shift Register(移位寄存器) 是 LabVIE…

前缀和问题

洛谷题面 这个其实可以当模板了。 代码&#xff1a; #include<bits/stdc.h> using namespace std; const int N1e510; int sum[N]; int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n,m,x;cin>>n;for(int i1;i<n;i){cin>>x;sum[i]sum[i…

《微信小程序实战(4) · 地图导航功能》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

240924-通过服务器代理ip地址及port端口wget等下载文件

A. 如何下载 在服务器上设置了代理 IP 和端口后&#xff0c;可以使用以下命令行格式通过 wget 下载文件&#xff1a; wget -e use_proxyyes -e http_proxyhttp://代理IP:端口号 目标文件URL或者&#xff0c;如果你使用 HTTPS 协议&#xff0c;可以使用以下命令&#xff1a; …

数据结构应试-1

1. 好像是错的 2. n个元素&#xff0c;插入的可能有n1个位置&#xff0c;所以n&#xff08;n1&#xff09;/2*(n1)2/n 3. 4. 5. 6. 假设我们有一个循环队列&#xff0c;数组的长度为 n 10&#xff0c;并且当前队头指针 f 的位置是 2&#xff0c;队尾指针 r 的位置是 8。我们需…

【开源免费】基于SpringBoot+Vue.JS墙绘产品展示交易平台(JAVA毕业设计)

本文项目编号 T 049 &#xff0c;文末自助获取源码 \color{red}{T049&#xff0c;文末自助获取源码} T049&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

携手SelectDB,观测云实现性能与成本的双重飞跃

在刚刚落下帷幕的2024云栖大会上&#xff0c;观测云又一次迎来了全面革新。携手SelectDB&#xff0c;实现了技术的飞跃&#xff0c;这不仅彰显了观测云在监控观测领域的技术实力&#xff0c;也预示着我们可以为全球用户提供更加高效、稳定的数据监测与分析服务。这一技术升级&a…

Golang | Leetcode Golang题解之第435题无重叠区间

题目&#xff1a; 题解&#xff1a; func eraseOverlapIntervals(intervals [][]int) int {n : len(intervals)if n 0 {return 0}sort.Slice(intervals, func(i, j int) bool { return intervals[i][1] < intervals[j][1] })ans, right : 1, intervals[0][1]for _, p : ra…

【计算机视觉】YoloV8-训练与测试教程

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 制作数据集 Labelme 数据集 数据集选用自己标注的&#xff0c;可参考以下&#xff1a…

面经 | css

CSS CSSpositiondisplayflex: 1元素居中flexalign-itemjustify-contentabsolutemargin:auto align-item vs vertical-align CSS position static: 默认。就是自然顺序&#xff0c;从上到下&#xff0c;从左到右&#xff0c;爱着你排列&#xff1b;absolute&#xff1a;绝对。…

如何备份SqlServer数据库

第一步&#xff1a;登录你要备份的服务器数据库ssms 第二步&#xff1a;选择你要备份的数据库 此处已PZ-SJCS 数据库为例 右键该数据库-->任务-->备份 第三步&#xff1a;选择你备份的类型备份组件等&#xff0c;目标磁盘 &#xff0c;点击添加选择将你备份的文件备份那…

数据结构~二叉搜索树

文章目录 一、二叉树搜索的概念二、二叉树搜索的结构二叉树搜索的性能分析二叉树搜索的插入二叉树搜索的查找二叉树搜索的删除 三、二叉搜索树key和key/value使用场景四、二叉树搜索的练习将二叉搜索树就地转化为已排序的双向循环链表从前序与中序遍历序列构造二叉树二叉树的前…

茶思屋直播|TinyEngine+AI:聚焦主航道,在实践中探索低代码技术黑土地

低代码引擎使能开发者定制低代码平台。它是低代码平台的底座&#xff0c;提供可视化搭建页面等基础能力&#xff0c;既可以通过线上搭配组合&#xff0c;也可以通过cli创建个人工程进行二次开发&#xff0c;实时定制出自己的低代码平台。适用于多场景的低代码平台开发&#xff…

GIS开发常用的开源地图数据框架有哪些?

学完Web前端开发&#xff0c;还需要掌握哪些内容&#xff1f;本篇文章再给大家主要讲讲针对WebGIS开发的地图和可视化数据库。 Echarts ECharts是一个使用 JavaScript 实现的开源可视化库。它可以流畅的运行在 PC 和移动设备上&#xff0c;兼容当前绝大部分浏览器&#xff08;…

LTE SSS产生过程中z序列的介绍和MATLAB以及C语言实现

参考3GPP 36.211 6.11章节 接上期介绍完LTE SSS产生过程中加扰序列c的产生和代码实现&#xff0c;本期介绍一下LTE SSS产生过程中加扰序列z的原理和MATLAB以及C语言的实现。 SSS产生过程中用到的加扰Z1序列有两个&#xff0c;一个是 另一个是 两个序列是由一个m序列z移位而来…

“一屏显江山”,激光显示重构「屏中世界」

【潮汐商业评论/原创】 2024年国庆期间&#xff0c;曾感动过无数国人的舞蹈诗剧《只此青绿》改编的同名电影即将上映&#xff0c;而这一次观众们不必走进电影院&#xff0c;在家里打开官方合作的海信激光电视也能享受到同等的视听效果&#xff0c;这是激光电视在观影场景领域的…

【C++ 基础数学 】2121. 2615相同元素的间隔之和|1760

本文涉及的基础知识点 基础数学 LeetCode2121. 相同元素的间隔之和 难度分&#xff1a;1760 令2165&#xff0c;和此题几乎相等。 给你一个下标从 0 开始、由 n 个整数组成的数组 arr 。 arr 中两个元素的 间隔 定义为它们下标之间的 绝对差 。更正式地&#xff0c;arr[i] 和…

Linux 进程2

环境变量 再Linux操作系统中一切皆文件&#xff0c;这个环境变量自然也是一个文件&#xff0c;它的作用是辅助我们使用操作系统还可以辨识我们是什么用户(一般用户&#xff0c;root用户)。 env是读取完整环境变量的指令&#xff0c;里面记录了许多我登录操作系统所用的用户的信…

apache paimon简介(官翻)

介绍 如下架构所示: 读/写操作: Paimon 支持多样化的数据读写方式,并支持 OLAP 查询。 读取: 支持从历史快照(批处理模式)中消费数据,从最新偏移量(流处理模式)中读取数据,或以混合方式读取增量快照。写入: 支持从数据库变更日志(CDC)进行流式同步,从离线数据中…