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.rhkb.cn/news/432787.html

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

相关文章

已存在的Python项目使用依赖管理工具UV

1. 文档 uv文档 2. 如何转换 初始化 uv initrequirements.txt转换成pyproject.toml uv add $(cat requirements.txt)删除requirements.txt 如果更新pyproject.toml之后,使用命令 uv sync替换项目环境 如果有库没有加入依赖,自己手动加一下&am…

助力降本增效,ByteHouse打造新一代云原生数据仓库

随着数据量的爆炸式增长、企业上云速度加快以及数据实时性需求加强,云原生数仓市场迎来了快速发展机遇。 据 IDC、Gartner 研究机构数据显示,到 2025 年,企业 50% 数据预计为云存储,75% 数据库都将运行在云上,全球数据…

【Kubernetes】日志平台EFK+Logstash+Kafka【实战】

一,环境准备 (1)下载镜像包(共3个): elasticsearch-7-12-1.tar.gz fluentd-containerd.tar.gz kibana-7-12-1.tar.gz (2)在node节点导入镜像: ctr -nk8s.io images i…

webpack使用

一、简介 概述 本次使用webpack4进行构建打包 二、webpack 安装webpack、webpack-cli npm install webpack4.2.0 webpack-cli4.2.0 -D 三、loader 加载器概述 raw-loader:加载文件原始内容(utf-8) file-loader:把文件输出…

CentOS 7 中安装 docker 环境

作者:程序那点事儿 日期:2023/02/15 02:31 官网地址 官网文档 docker三种网络模式 Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求。 Docker 分为 CE 和 EE 两大版本。CE 即社区…

蓝桥杯1.小蓝的漆房

样例输入 2 5 2 1 1 2 2 1 6 2 1 2 2 3 3 3样例输出 1 2 import math import os import sys tint(input())#执行的次数 for j in range(t):n,kmap(int,input().split())#n为房间数 k为一次能涂的个数alist(map(int,input().split()))#以列表的形式存放房间的颜色maxvaluemath…

81、Python之鸭子类型:从魔法函数看对象的字符串呈现

引言 前面已经介绍了鸭子类型的概念,以及Python中支撑鸭子类型理念的“魔法函数”的体系。Python中的魔法函数分为几大类,本文我们首先从最简单的自定义类型的字符串呈现来切入,逐步理解并掌握Python中的魔法函数的完整架构。 本文的主要内…

玩转指针(3)

一、字符指针变量 字符指针变量(如char* p)的两种赋值方式 ①将字符类型地址赋值给字符指针变量 int main() {char a w;char* p &a;*p m;return 0; }②将常量字符串赋值给字符指针变量 常量字符串的介绍:用" "引起来的就…

以Flask为基础的虾皮Shopee“曲线滑块验证码”识别系统部署

以Flask为基础的虾皮Shopee“曲线滑块验证码”识别系统部署 一、验证码类型二、简介三、Flask应用 一、验证码类型 验证码类型:此类验证码存在两个难点,一是有右侧有两个凹槽,二是滑块的运动轨迹不是直线的,而是沿着曲线走的&…

STM32通过HAL库编码方式,在烧写一次程序后,单片机在仿真器上识别不到

在将项目从裸机移植到rtt过程中,总体调试跑不通ADC,进行了单独调试,新程序烧写进单片机后,仿真器再也识别不到单片机。一遍遍检查后发现HAL库没有配置完全。 SYS需要设置成 Serial Wire,忘记设置就成了No Debug,写这么…

基于nodejs+vue的水产品销售管理系统

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

如何在 macOS(MacBook Pro、Air 和 iMac)上恢复未保存的 Word 文档

Microsoft Word 在许多用户中很受欢迎,并且有多种用途。无论是为学校写论文、在办公室写报告还是其他许多事情。但是不保存文档并丢失数据可能是您可能面临的最可怕的噩梦。但是,也有几种方法可以在 macOS 上恢复未保存的 Word 文档。 用户在 Windows P…

wpf中如何访问控件和生成使用事件?

实际上对于初次使用wpf的同学来说,尤其是有winform编程经验的童鞋来说,最需要解决的就是快速掌握访问控件的方法以及生成和使用事件。这样才能让页面具有最起码的交互性。下面我们来分别讲述。 文章原出处:https://blog.csdn.net/haigear/ar…

网络原理(4)——网络层(IP)、数据链路层

1. IP 协议 基本概念: 主机:配有 IP 地址,但是不进行路由控制的设备 路由器:即配有 IP 地址,又能进行路由控制 节点:主机和路由器的统称 IP 协议报头格式 1) 4 位版本:实际上只有两个取值&…

C语言题目之单身狗2

文章目录 一、题目二、思路三、代码实现 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目 二、思路 第一步 在c语言题目之打印单身狗我们已经讲解了在一组数据中出现一个单身狗的情况,而本道题是出现两个单身狗的情况。根据一个数…

9.C++程序中的选择语句

选择语句一共分为两种:条件语句和开关语句 其中条件语句叫if语句,常见的形式为:if ... else ... ; 再复杂一些为if... else if ... else ... ; 开关语句又叫switch语句,类型于开关的使用形式常见的有 switch (var) case : ... b…

tauri中加载本地文件图片或者下载网络文件图片后存储到本地,然后通过前端页面展示

有一个需求是需要将本地上传的文件或者网络下载的文件存储到本地,并展示在前端页面上的。其实如果只是加载本地文件,然后展示还是挺简单的,可以看我的文章:tauri程序加载本地图片或者文件在前端页面展示-CSDN博客 要想实现上述需…

JS 历史简介

目录 1. JS 历史简介 2. JS 技术特征 1. JS 历史简介 举例:在提交用户的注册信息的时候,为避免注册出现错误后重新填写信息,可以在写完一栏信息后进行校验,并提示是否出现错误,这样会大大提高用户提交的成功率&…

gradle镜像配置

当我们在Android Studio中新建项目或者打开已有项目时,会下载gradle文件,当使用官方的下载源时很慢,经常会下载失败,国内我们可以使用腾讯或者阿里的镜像,一般下载速度很快。 一、gradle下载地址 官网地址&#xff1…

C语言指针系列2——加深理解

大家,今天讲的知识点是一块儿一块儿的,所以大家要好好学习喔~ 话不多说,开始正题 关键字:const (三种用法) 1. int* const p; 2. int const* p; 3. const int* const p; 首先我们要了解一下const&#xff…