Java面试题精选:设计模式(二)

news2024/12/25 9:14:49

1、装饰器模式与代理模式的区别

1)代理模式(Proxy Design Pattern )
原始定义是:让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问,并允许将请求提交给对象前后进行一些处理。

代理模式的适用场景

  • 功能增强
    当需要对一个对象的访问提供一些额外操作时,可以使用代理模式
  • 远程(Remote)代理
    实际上,RPC框架也可以看做一种代理模式,GoF的《设计模式》一书中把它称作远程代理。通过远程代理,将网络通信、数据编解码等细节隐藏起来。客户端在使用RPC服务的时候,就像使用本地函数一样,无需了解与服务器交互的细节。除此之外,RPC服务的开发者只需要开发业务逻辑,就像开发本地使用的函数一样,不需要关注与客户端的交互细节
  • 防火墙(Firewall)代理
    当将浏览器配置成使用代理功能时,防火墙就将你的浏览器的请求转给互联网;当互联网返回响应时,代理服务器再把它转给你的浏览器。
  • 保护(Protect or Access)代理
    控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。

2)装饰器模式(decorator pattern)
原始定义是:动态的给一个对象添加一些额外的职责. 就扩展功能而言,装饰器模式提供了一种比使用子类更加灵活的替代方案.

装饰器模式的适用场景

  • 快速动态扩展和撤销一个类的功能场景。 比如,有的场景下对 API 接口的安全性要求较高,那么就可以使用装饰模式对传输的字符串数据进行压缩或加密。如果安全性要求不高,则可以不使用。
  • 不支持继承扩展类的场景。 比如,使用 final 关键字的类,或者系统中存在大量通过继承产生的子类。

装饰器模式与代理模式的区别
对装饰器模式来说,装饰者(decorator)和被装饰者(decoratee)都实现同一个 接口。
对代理模式来说,代理类(proxy class)和真实处理的类(real class)都实现同一个接口。
他们之间的边界确实比较模糊,两者都是对类的方法进行扩展,具体区别如下:

  1. 装饰器模式强调的是增强自身;
    代理模式强调要让别人帮忙去做一些与自身没有太多关系的职责(如记录日志、设置缓存)。代理模式是为了实现对对象的控制,因为被代理的对象一般是难以直接获得或者对象内部不想暴漏
  2. 装饰器模式是以对客户端透明的方式扩展对象的功能,是继承方案的一个替代方案
    代理模式是给一个对象提供一个代理对象,并由代理对象来控制对原有对象的引用
  3. 装饰模式是为装饰的对象增强功能;而代理模式对代理的对象施加控制

2 JDK 类库常用的设计模式有哪些?

(1) 抽象工厂

  • javax.xml.parsers.DocumentBuilderFactory抽象类
  • public static DocumentBuilderFactory newInstance()方法
  • 类功能:使得应用程序可以通过XML文件,获得一个能生成DOM对象的解析器。
  • 方法功能:获取一个DocumentBuilderFactory的新实例。这一静态方法会创建一个新的工厂实例。

(2)建造者模式

  • java.lang.StringBuilder,这是一个final类。
  • public StringBuilder append(String str)方法,这一方法是对父类的覆写。
  • 类功能:用于一个不可更改的字符序列。
  • 方法功能:根据现有字符序列和追加字符,通过系统拷贝方法System.arraycopy生成一个新的字符序列。

(3)工厂模式

  • java.text.NumberFormat抽象类。
  • public final static NumberFormat getInstance()方法。
  • 类功能:用于数字格式的抽象基类。
  • 方法功能:返回一个“对当前默认场景下的一个通用数字格式”的NumberFormat。显然属于工厂模式的使用。

(4)原型模式

  • java.lang.Object
  • protected native Object clone() 方法
  • 类功能:所有类的父类
  • 方法功能:根据现有实例,返回一个浅拷贝对象。

(5)单例模式

  • java.lang.RunTime类
  • public static Runtime getRuntime()
  • 类功能:每一个运行的java应用都会有一个唯一的RunTime类的实例,这个实例使得应用程序在运行期间能够受到运行环境的影响。
  • 方法功能:返回一个和当前java应用关联的RunTime对象。

6)适配器模式

  • java.util.Arrays。
  • public static List asList(T… a)方法。
  • 类功能:此类包含了大量对数组操作的方法。
  • 方法功能:将一个引用类型的数组转为一个List。从而可以使用List类的操作来操作数组对象,但是有一点要注意:就是不能使用add(),remove()操作,因为返回的list底层是基于数组的,数组结构是不能更改的。 list类就是这里的适配器,通过这个适配器,对数组的直接操作变为间接操作。

3 Mybatis框架中使用的设计模式有哪些?

(1)建造者模式

  • 在Mybatis环境的初始化过程中,SqlSessionFactoryBuilder会调用 XMLConfigBuilder读取所有的 MybatisMapConfig.xml和所有的 *Mapper.xml文件,构建Mybatis运行的核心对象 Configuration对象,然后将该 Configuration对象作为参数构建一个 SqlSessionFactory对象。

(2)工厂模式

  • 在Mybatis中比如 SqlSessionFactory使用的是工厂模式,该工厂没有那么复杂的逻辑,是一个简单工厂模式。
    image.png
  • SqlSession可以认为是一个Mybatis工作的核心的接口,通过这个接口可以执行执行SQL语句、获取Mappers、管理事务。类似于连接MySQL的 Connection对象。

(3)单例模式
在Mybatis中有两个地方用到单例模式,ErrorContextLogFactory,其中 ErrorContext是用在每个线程范围内的单例,用于记录该线程的执行环境错误信息,而 LogFactory则是提供给整个Mybatis使用的日志工厂,用于获得针对项目配置好的日志对象。

public class ErrorContext {private static final ThreadLocal<ErrorContext> LOCAL = new ThreadLocal<>();​​    
	private ErrorContext() {  
	}public static ErrorContext instance() {        
		ErrorContext context = LOCAL.get();       
		if (context == null) {            
			context = new ErrorContext();            
			LOCAL.set(context);        
		}        
	return context;    
	}}

(4)代理模式

  • 代理模式可以认为是Mybatis的核心使用的模式,正是由于这个模式,我们只需要编写 Mapper.java接口,不需要实现,由Mybatis后台帮我们完成具体SQL的执行。

(5)适配器模式
在Mybatsi的logging包中,有一个Log接口,该接口定义了Mybatis直接使用的日志方法,而Log接口具体由谁来实现呢?Mybatis提供了多种日志框架的实现,这些实现都匹配这个Log接口所定义的接口方法,最终实现了所有外部日志框架到Mybatis日志包的适配。
image.png

4 Spring框架中使用的设计模式有哪些?

1)简单工厂

BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。

2)工厂方法

FactoryBean接口

实现了FactoryBean接口的bean是一类叫做factory的bean。其特点是,spring会在使用getBean()调用获得该bean时,会自动调用该bean的getObject()方法,所以返回的不是factory这个bean,而是这个bean.getOjbect()方法的返回值。

3)单例模式

Spring依赖注入Bean实例默认是单例的。

Spring的依赖注入(包括lazy-init方式)都是发生在AbstractBeanFactory的getBean里。getBean的doGetBean方法调用getSingleton进行bean的创建。

4)适配器模式

SpringMVC中的适配器HandlerAdatper。

HandlerAdatper使得Handler的扩展变得容易,只需要增加一个新的Handler和一个对应的HandlerAdapter即可。

因此Spring定义了一个适配接口,使得每一种Controller有一种对应的适配器实现类,让适配器代替controller执行相应的方法。这样在扩展Controller时,只需要增加一个适配器类就完成了SpringMVC的扩展了。

5)装饰器模式

Spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator。

动态地给一个对象添加一些额外的职责。

就增加功能来说,Decorator模式相比生成子类更为灵活。

6)代理模式

AOP底层,就是动态代理模式的实现。

7)观察者模式

Spring 基于观察者模式,实现了自身的事件机制也就是事件驱动模型,事件驱动模型通常也被理解成观察者或者发布/订阅模型。

8)策略模式

Spring框架的资源访问Resource接口。该接口提供了更强的资源访问能力,Spring 框架本身大量使用了 Resource 接口来访问底层资源。

Rsource 接口是具体资源访问策略的抽象,也是所有资源访问类所实现的接口。

Resource 接口本身没有提供访问任何底层资源的实现逻辑,针对不同的底层资源,Spring 将会提供不同的 Resource 实现类,不同的实现类负责不同的资源访问逻辑。

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

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

相关文章

自然语言处理:从入门到精通全指引

一、引言 自然语言处理&#xff08;NLP&#xff09;作为人工智能领域的关键分支&#xff0c;旨在让计算机理解、生成和处理人类语言&#xff0c;近年来取得了令人瞩目的成就&#xff0c;在智能客服、机器翻译、文本分析、语音助手等众多领域发挥着重要作用。从入门到精通自然语…

Typora 修改默认的高亮颜色

shift F12 参考 怎么给typora添加颜色&#xff1f;

(1)Quartus中如何在外设FLASH中固化jic文件

&#xff08;1&#xff09;在产生jic文件前&#xff0c;必须已经综合通过&#xff0c;生成了sof文件 &#xff08;2&#xff09;点击file-convert Programming Files... &#xff08;3&#xff09;文件类型选择jic文件&#xff0c;flsh型号设定为EPCS128 &#xff08;4&#…

OpenAI2024-12D-3:Sora 发布,谁更胜一筹——Sora 与可灵的全面前瞻对比

藏了一年&#xff0c;终于OpenAI在12天活动的第三天&#xff0c;正式发布了其全新创意工具——Sora&#xff0c;这款工具凭借其强大的文本到视频生成能力和高度的创作自由度&#xff0c;迅速吸引了广大创作者的目光。与此同时&#xff0c;已经在视频创作领域有着成熟表现的可灵…

重生之我在异世界学智力题(4)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言渡河问题&#xff08;1&#xff09;问…

福州大学《2024年812自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《福州大学812自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题

实现盘盈单自动化处理:吉客云与金蝶云星空数据对接

盘盈单103v2对接其他入库&#xff1a;吉客云数据集成到金蝶云星空 在企业信息化管理中&#xff0c;数据的高效流转和准确性至关重要。本文将分享一个实际案例&#xff0c;展示如何通过轻易云数据集成平台&#xff0c;将吉客云的数据无缝对接到金蝶云星空&#xff0c;实现盘盈单…

Meta Llama 3.3 70B:性能卓越且成本效益的新选择

Meta Llama 3.3 70B&#xff1a;性能卓越且成本效益的新选择 引言 在人工智能领域&#xff0c;大型语言模型一直是研究和应用的热点。Meta公司最近发布了其最新的Llama系列模型——Llama 3.3 70B&#xff0c;这是一个具有70亿参数的生成式AI模型&#xff0c;它在性能上与4050…

【优选算法 前缀和】前缀和算法模板详解:一维前缀 & 与二维前缀和

一维前缀和 题目解析 算法原理 解法一&#xff1a;暴力解法 简单模拟&#xff0c;读完题意有 q 次询问&#xff0c;给哪两个数&#xff0c;就求哪段区间的和并且返回&#xff0c;这样的做法&#xff0c;时间复杂度为O(N*q)&#xff0c;这个时间复杂度会超时&#xf…

yarn : 无法加载文件 C:\Users\L\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁

关于执行安装yarn命令后执行yarn -v报错&#xff1a; 先确认执行安装yarn命令是否有误 # 安装yarn npm install yarn -g 终端输入set-ExecutionPolicy RemoteSigned 当然如果yarn -v仍然执行失败&#xff0c;考虑使用管理员方式运行IDEA&#xff0c; 注&#xff1a;如上操作…

设计模式——单例模式和工厂模式

单例模式:一个类只创建一个类对象&#xff08;节省内存减少类对象数量,一个类对象多次重复使用&#xff09; 格式: class a: pass ba() z1b z2b #z1和z2为同一个类对象 工厂模式&#xff1a;&#xff08;大批量创建具体的类对象,统一类对象入口便于维护&#xf…

UVM之寄存器模型生成

1.采用python脚本生成寄存器模型 首先用excel表格做好寄存器描述 然后编写脚本生成.ralf文件 &#xff08;1&#xff09;首先通过openpyxl读取EXCEL表格&#xff0c; workbook openpyxl.load_workbook(reg.xlsx) # 返回一个workbook数据类型的值 &#xff08;2&#xff…

web 期末作业简单设计网页——“我的家乡”网站简单设计

1、网页效果 首页 七彩云南页 旅游攻略页 用户页面 2、源代码 首页 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>首页</title><link rel"stylesheet" href"out.css&quo…

Nanolog起步笔记-10-log解压过程(4)寻找meta续2

Nanolog起步笔记-10-log解压过程4寻找meta续2 写在前面重新开始trace readDictionaryFragment读取meta头部读入每个记录createMicroCode读入头部&#xff0c;和文件名 切分format字符串PrintFragment 后记 写在前面 前面的工作&#xff0c;已做打下令人有信心的基础。 重新开…

编译问题 fatal error: rpc/rpc.h: No such file or directory

在编译一些第三方软件的时候&#xff0c;会经常遇到一些文件识别不到的问题&#xff0c;这里整理下做个归总。 目前可能的原因有&#xff08;排序分先后&#xff09;&#xff1a; 文件不存在&#xff1b;文件存在但路径识别不了&#xff1b;…… 这次以常见的编译lmbench测试…

【OpenCV】Canny边缘检测

理论 Canny 边缘检测是一种流行的边缘检测算法。它是由 John F. Canny 在 1986 年提出。 这是一个多阶段算法&#xff0c;我们将介绍算法的每一个步骤。 降噪 由于边缘检测易受图像中的噪声影响&#xff0c;因此第一步是使用 5x5 高斯滤波器去除图像中的噪声。我们在前面的章…

记录:ubuntu 使用chattts的过程。

你知道什么是穷人吗&#xff1f;穷人就是没钱还想学习。 git GitHub - 2noise/ChatTTS: A generative speech model for daily dialogue. 因为所以。cosyvoice&#xff0c;gpt-s . 0.先找一个目录吧。 1.命令行模式 duyichengduyicheng-computer:~/gitee$ git clone https:…

鸿蒙实现应用通知

目录&#xff1a; 1、应用通知的表现形式2、应用通知消息的实现1、发布普通文本类型通知2、发布进度类型通知3、更新通知4、移除通知 3、设置通知道通展示不同形式通知4、设置通知组5、为通知添加行为意图1、导入模块2、创建WantAgentInfo信息3、创建WantAgent对象4、构造Notif…

Redis篇-6--原理篇5--单线程模型

1、概述 Redis 采用单线程模型来处理客户端请求&#xff0c;这意味着在任意时刻只有一个命令被执行。这种设计简化了 Redis 的实现&#xff0c;并确保了高并发环境下的数据一致性。尽管 Redis 是单线程的&#xff0c;但它通过高效的内存管理和网络 I/O 操作&#xff0c;仍然能…

stm32 GPIO8种输入输出模式

1、分类&#xff1a; 2、输出详解 2.1 推挽输出、复用推挽输出 GPIO_Mode_Out_PP (Output Push-Pull)、GPIO_Mode_AF_PP (Alternate Function Push-Pull) 推挽模式下&#xff0c;内部供电&#xff0c;电路主要控制P-MOS、N-MOS通、断电流实现I/O高、低电平输出 -->应用&…