Java——《面试题——设计模式篇》

news2024/12/23 10:57:25

 前文

java——《面试题——基础篇》

Java——《面试题——JVM篇》

Java——《面试题——多线程&并发篇》

Java——《面试题——Spring篇》

Java——《面试题——SpringBoot篇》

Java——《面试题——MySQL篇》​​​​​​

Java——《面试题——SpringCloud》

Java——《面试题——Dobbo篇》

Java——《面试题——Nginx篇》

 Java——《面试题——MQ篇》

 Java——《面试题——Linux篇》

Java——《面试题——Zookeeper篇》

Java——《面试题——Redis篇》

Java——《面试题——分布式篇》

 Java——《面试题——网络篇》

目录

 前文

 1、说说什么是单例模式

2、说说你对代理模式的理解

3、说说工厂模式

4、抽象工厂模式

5、装饰器模式是什么

6、代理模式和装饰器模式有什么区别?

7、模板方法模式

8、知道享元模式吗?

9、享元模式和单例模式的区别?

10、说说策略模式在我们生活的场景?

11、知道责任链模式吗?

12、了解过适配器模式么?

13、知道观察者模式吗?


设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它 不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方 案。 

1995 年,GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:可复用面向对象软件的 基础》一书,共收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑,人称「GoF设计模 式」。

通常面试中会问:

说一下你知道哪些设计模式?

这时候,就得需要平时积累下来的经验了,肯定回答自己会的,你只是知道名词是没用用的。从难 易程度和常用情况来看可以这么回答:

单例模式、代理模式、模板方法模式、装饰器模式、工厂模式、责任链模式、观察者模式、原型模 式。

通常你能回答这么多就已经ok了。但是其他模式,可以适当的了解了解,不然面试官问你还有其他 设计模式吗?

这时候,你就可以回答名词了,他再问,你就说这些设计模式只是了解过,在工作中用的不是很 多。

 1、说说什么是单例模式

答:单例模式是一种常用的软件设计模式,在应用这个模式时,单例对象的类必须保证只有一个实 例存在,整个系统只能使用一个对象实例。

优点:不会频繁地创建和销毁对象,浪费系统资源。

可能这会需要你手写一个单例模式,这就得自己去学了,因为单例模式有很多种写法,懒汉模式, 饿汉模式,双重检查模式等。懒汉模式就是用的时候再去创建对象,饿汉模式就是提前就已经加载 好的静态static对象,双重检查模式就是两次检查避免多线程造成创建了多个对象。

单例模式有很多种的写法,我总结一下:

(1)饿汉式单例模式的写法:线程安全

(2)懒汉式单例模式的写法:非线程安全

(3)双检锁单例模式的写法:线程安全

2、说说你对代理模式的理解

代理模式是给某一个对象提供一个代理,并由代理对象控制对原对象的引用。

优点:

  • 代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度;
  • 可以灵活地隐藏被代理对象的部分功能和服务,也增加额外的功能和服务。

缺点:

  • 由于使用了代理模式,因此程序的性能没有直接调用性能高;
  • 使用代理模式提高了代码的复杂度。

黄牛卖火车票:没有流行网络购票的年代是很喜欢找黄牛买火车票的,因为工作忙的原因,没时间 去买票,然后就托黄牛给你买张回家过年的火车票。这个过程中黄牛就是代理人,火车票就是被代 理的对象。

婚姻介绍所:婚姻介绍所的工作人员,搜集单身人士信息,婚介所的工作人员为这个单身人士找对 象,这个过程也是代理模式的生活案例。对象就是被代理的对象。

注意了,问代理模式的时候,很有可能会问:动态代理。在Spring篇中已经讲述过,如果你把动态 代理讲了后,很有可能还会问什么是静态代理?一个洞一个是静,大致也能才出来,就是中间代理 层使我们手动写的,通常说的代理模式就是静态代理。

3、说说工厂模式

答:简单工厂模式又叫静态工厂方法模式,就是建立一个工厂类,对实现了同一接口的一些类进行 实例的创建。比如,一台咖啡机就可以理解为一个工厂模式,你只需要按下想喝的咖啡品类的按钮 (摩卡或拿铁),它就会给你生产一杯相应的咖啡,你不需要管它内部的具体实现,只要告诉它你 的需求即可。

优点:

  • 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除 直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分 割,它提供了专门的工厂类用于创建对象;
  • 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于 一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量;
  • 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一 定程度上提高了系统的灵活性。

缺点:

  • 不易拓展,一旦添加新的产品类型,就不得不修改工厂的创建逻辑;
  • 产品类型较多时,工厂的创建逻辑可能过于复杂,一旦出错可能造成所有产品的创建失败,不 利于系统的维护。

4、抽象工厂模式

答:抽象工厂模式是在简单工厂的基础上将未来可能需要修改的代码抽象出来,通过继承的方式让 子类去做决定。

比如,以上面的咖啡工厂为例,某天我的口味突然变了,不想喝咖啡了想喝啤酒,这个时候如果直 接修改简单工厂里面的代码,这种做法不但不够优雅,也不符合软件设计的“开闭原则”,因为每次 新增品类都要修改原来的代码。这个时候就可以使用抽象工厂类了,抽象工厂里只声明方法,具体 的实现交给子类(子工厂)去实现,这个时候再有新增品类的需求,只需要新创建代码即可。

5、装饰器模式是什么

答:装饰器模式是指动态地给一个对象增加一些额外的功能,同时又不改变其结构。

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模 式可以动态扩展一个实现类的功能。

装饰器模式的关键:装饰器中使用了被装饰的对象。

比如,创建一个对象“laowang”,给对象添加不同的装饰,穿上夹克、戴上帽子......,这个执行过程 就是装饰者模式。

一句名言:人靠衣裳马靠鞍。都是装饰器模式的生活案列。

6、代理模式和装饰器模式有什么区别?

答:都是结构型模式,代理模式重在访问权限的控制,而装饰器模式重在功能的加强。

7、模板方法模式

答:模板方法模式是指定义一个算法骨架,将具体内容延迟到子类去实现。

优点:

  • 提高代码复用性:将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中;
  • 实现了反向控制:通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为, 实现了反向控制并且符合开闭原则。

喝茶茶:烧水----放入茶叶---喝茶。放入的茶叶每个人自己的喜好不一样,有的是普洱、有的是铁观 音等。

每日工作:上班打卡----工作---下班打卡。每个人工作的内容不一样,后端开发的、前端开发、测 试、产品每个人的工作内容不一样。

8、知道享元模式吗?

答:顾名思义就是被共享的单元。享元模式的意图是复用对象,节省内存,前提是享元对象是不可 变对象

具体来讲,当一个系统中存在大量重复对象的时候,如果这些重复的对象是不可变对象,我们就可 以利用享元模式将对象设计成享元,在内存中只保留一份实例,供多处代码引用。这样可以减少内 存中对象的数量,起到节省内存的目的。

典型的使用场景:Integer中cache,就是享元模式很经典的实现。

怎么看起来享元模式和单例模式是一毛一样的?面试官很有可能会继续问:

9、享元模式和单例模式的区别?

答:单例模式是创建型模式,重在只能有一个对象。而享元模式是结构型模式,重在节约内存使 用,提升程序性能。

享元模式:把一个或者多可对象霍村起来,用的时候,直接从缓存里获取。也就是说享元模式不一 定只有一个对象。

10、说说策略模式在我们生活的场景?

答:策略模式是指定义一系列算法,将每个算法都封装起来,并且使他们之间可以相互替换。

优点:遵循了开闭原则,扩展性良好。

缺点:随着策略的增加,对外暴露越来越多。

条条大路通罗马,条条大路通北京。

我们去北京的交通方式(策略)很多,比如说坐飞机、坐高铁、自己开车等方式。每一种方式就可 以理解为每一种策略。

这就是生活中的策略模式。

11、知道责任链模式吗?

答:是行为型设计模式之一,其将链中每一个节点看作是一个对象,每个节点处理的请求均不同, 且内部自动维护一个下一节点对象。当一个请求从链式的首端发出时,会沿着链的路径依次传递给 每一个节点对象,直至有对象处理这个请求为止。

优点

  • 解耦了请求与处理;
  • 请求处理者(节点对象)只需关注自己感兴趣的请求进行处理即可,对于不感兴趣的请求,直 接转发给下一级节点对象;
  • 具备链式传递处理请求功能,请求发送者无需知晓链路结构,只需等待请求处理结果;
  • 链路结构灵活,可以通过改变链路结构动态地新增或删减责任;
  • 易于扩展新的请求处理类(节点),符合 开闭原则;

缺点

  • 责任链路过长时,可能对请求传递处理效率有影响;
  • 如果节点对象存在循环引用时,会造成死循环,导致系统崩溃;

生活案列:我们在公司内部发起一个OA审批流程,项目经理审批、部门经理审批。老板审批、人力 审批。这就是生活中的责任链模式,每个角色的责任是不同。

SpringMVC中的拦截器和Mybatis中的插件机制,都是拦截器经典实现。

12、了解过适配器模式么?

答:适配器模式是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而无 法一起工作的两个类能够在一起工作。

优点:

  • 可以让两个没有关联的类一起运行,起着中间转换的作用;
  • 灵活性好,不会破坏原有的系统。

缺点:

过多地使用适配器,容易使代码结构混乱,如明明看到调用的是 A 接口,内部调用的却是 B 接口的实现。

生活中的插座,为了适应各种插头,然后上面有两个孔的,三个空的,基本都能适应。还有万能充 电器、USB接口等。这些都是生活中的适配器模式。

13、知道观察者模式吗?

答:观察者模式是定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关 依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模 型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模 式。

优点:

  • 观察者模式可以实现表示层和数据逻辑层的分离,并定义了稳定的消息更新传递机制,抽象了 更新接口,使得可以有各种各样不同的表示层作为具体观察者角色;
  • 观察者模式在观察目标和观察者之间建立一个抽象的耦合;
  • 观察者模式支持广播通信;
  • 观察者模式符合开闭原则(对拓展开放,对修改关闭)的要求。

缺点:

  • 如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多 时间;
  • 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能 导致系统崩溃;
  • 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知 道观察目标发生了变化。

在观察者模式中有如下角色:

  • Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每 个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象;
  • ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在 具体主题的内部状态发生改变时,给所有注册过的观察者发送通知;
  • Observer:抽象观察者,是观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改 通知时更新自己;
  • ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知 时更新自身的状态。

在Spring中大量的使用的观察者模式,只要看到是以Event结尾或者Publish开头的基本上都是观察 者模式。

上面一共说了11种设计模式,这些设计模式能应对绝大多数人和面试场景来说。建议私下自己用代 码实现一番,便于更好地理解。

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

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

相关文章

QThread

QThread的执行从run()函数的执行开始; 在Qt中建立线程的主要目的就是为了用线程来处理那些耗时的后台操作,从而让主界面能及时响应用户的请求操作。 QThread的使用 链接 work对象 1,继承Qobject; 2,dowork(); 使…

(stm32)Unix时间戳

时间戳计时系统和常用的年月日时分秒计时系统有很大差别 时间戳:只计算从1970年1月1日0点整为0秒,只用最基本的秒来计时,用不进位。 常用计时系统:60秒进位1分钟,60分钟进位1小时,24小时进位1天&#xff…

Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库

介绍 Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式&a…

电子器件系列44:IGBT的内部电容

对两款igbt进行比较,确定两者是否可以互换 A: B: 一、 从电路图上分析,在启动的时候,电路会提供一个15v的电压,两者都能顺利导通,可以替换 二、 开关时间 从实际使用电路上分析,这些参数对于本电路的功能…

随机数检测(二)

随机数检测(二)- 扑克检测、重叠子序列、游程总数、游程分布 3.4 扑克检测方法3.5 重叠子序列检测方法3.6 游程总数检测3.7 游程分布检测 3.4 扑克检测方法 扑克检测方法如下图。 以下实现代码供参考。 def alterOffsetBit(m, offset, listSub:list)…

HoloLens2与Unity的Socket通信踩坑日记

最近想让Hololens中获取电脑中更新的数据,打算使用套接字的方式进行通信,明明在unity中模拟测试可以进行正常通信,但是将软件部署到HoloLens上通信总是失败,找了很久的原因,找了很久的原因,终于能够正常通信…

国产自研开源大数据管理平台DataSophon

【背景】 几天在朋友圈看到开源社区Datavane发布了一个新开源项目DataSophon;一个致力于快速实现部署、管理、监控以及自动化运维大数据云原生平台,帮助快速构建起稳定、高效、可弹性伸缩的大数据云原生平台;从介绍内容来看非常优秀&#xff…

事务管理-@TransActional

事务 概念:一组操作集合,是一个不可分割的单位,这些操作要么同时成功,要么同时失败 事务操作 开启事务(一组操作开始前,开启事务):start transaction / begin;提交事务(操作全部成…

AutoSAR系列讲解(入门篇)4.8-BSW的OS功能

一、OS架构和术语解释 OS: 操作系统。就仅仅位于系统服务层,由于OS是需要直接操作硬件的一些功能的,所以系统服务层才会贯穿三层结构至达硬件。AutoSAR OS是基于OSEK OS开发出来的,OSEK也是早期ECU上的OS标准了,现在也…

matplotlib 区域填充

import matplotlib.pyplot as plt import numpy as npx np.linspace(0, 8 * np.pi, 1000) siny np.sin(x) cosy np.cos(x / 2) / 2 plt.plot(x, siny, cskyblue, labelsin-X) plt.plot(x, cosy, corangered, label1/2 cos 1/2x )# 填充颜色 plt.fill_between(x, cosy, siny,…

TiDB 多租户方案和原理

作者: li_zhenhuan 原文来源: https://tidb.net/blog/a55c1d14 使用多租户 有很多文章介绍技术上如何使用多租户,在这里简单说明: CREATE RESOURCE GROUP rg_oltp RU_PER_SEC4000; ALTER USER app1 RESOURCE GROUP "r…

java——Collection、Map 深度理解

Collection <类型>&#x1f349; List(Conllection的实现类) 可以重复&#xff0c;有顺序 可存放多个null值&#x1f95d; ArrayList 主选 &#x1f353; 结构&#xff1a;数组 特点&#xff1a;查找快&#xff0c;增删慢 线程不安全&#xff0c;效率高 Vector&#…

第十三章 原理篇:SWIN-transformer

累了&#xff0c;没写完 面试完了再来写 参考教程&#xff1a; swin-transformer/model.py 文章目录 概述transformer blockswindow_partionW-MSAwindow-reversePatch Merging 概述 在前面介绍了vision transformer的原理&#xff0c;加入transformer的结构后&#xff0c;这种…

HCIP(HCIA回顾)

OSI/RM 七层 应用层 表示层 会话层 传输层 区分不同的流量&#xff0c;定义传输方式。 端口号由16位二进制构成&#xff0c;范围为0~65535(其中0不作为传输层的端口使用)&#xff0c;所以真实取值范围为1~65535&#xff1b;其中&#xff0c;1~1023称为知名端口号。 1、可靠…

React Native 集成到iOS原有的项目上

1.官方说明地址&#xff1a; 集成到现有原生应用 2. 主要步骤说明 把 React Native 组件集成到 iOS 应用中有如下几个主要步骤&#xff1a; 配置好 React Native 依赖和项目结构。了解你要集成的 React Native 组件。使用 CocoaPods&#xff0c;把这些组件以依赖的形式加入到项…

【推式子 二项式定理】Wannafly挑战赛 B

B-求值2_Wannafly挑战赛17 (nowcoder.com) 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>#define int long longusing namespace std;const int mxn2e610; const int mxe2e510; const int Inf0x3f3f3f3f; const int mod998244353;int N;…

碳排放预测模型 | Python实现基于RF随机森林的碳排放预测模型

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 碳排放预测模型 | Python实现基于RF随机森林的碳排放预测模型 研究内容 碳排放被认为是全球变暖的最主要原因之一。 该项目旨在提供各国碳排放未来趋势的概述以及未来十年的全球趋势预测。 其方法是分析这…

sql统计某一字段不同状态的数量,时间戳转日期格式、按月统计使用

背景 1、在sql语句中统计一个字段的不同状态时&#xff0c;需要将每个状态的数量查出来&#xff0c;在进行统一输出&#xff0c;涉及表多次查询&#xff0c;下面用一个聚合函数的方式进行查询&#xff0c;比较方便&#xff0c;容易理解。 2、有时候数据表中的时间字段存储的是…

谈高考志愿填报

目录 不如先说说我自己。 一、选专业还是选学校&#xff1a; 二、你想推荐/避雷的专业&#xff1a; 三、填报志愿的策略&#xff1a; 四、影响专业选择的因素&#xff1a; 各省高考成绩已出&#xff0c;又到一年高考季。张雪峰提到&#xff1a;“普通家庭不要光谈理想&…

OpenCV实战(27)——追踪视频中的特征点

OpenCV实战&#xff08;27&#xff09;——追踪视频中的特征点 0. 前言1. 追踪视频中的特征点2. 特征点追踪原理3. 完整代码小结系列链接 0. 前言 我们已经知道可以通过一些最独特的点来分析图像&#xff0c;对于图像序列同样如此&#xff0c;其中一些特征点的运动可用于了解捕…