Java面试题系列 - 第9天
题目:深入探讨Java中的设计模式及其应用场景
背景说明:设计模式是软件工程中解决问题的常见方案,它们提供了经过验证的模板,帮助开发者解决在软件设计过程中遇到的特定问题。在Java中,熟悉并正确应用设计模式能够显著提升代码的可读性、可维护性和可扩展性。
问题要求:
- 解释设计模式的概念及其重要性。
- 列举并描述几种常见的设计模式,包括它们的分类。
- 分析每种设计模式的应用场景和优势。
- 提供一个具体的设计模式示例,并说明其在实际开发中的应用。
答案批注:
-
设计模式的概念及其重要性:设计模式是一种在特定上下文中解决常见设计问题的标准化方法。它们是前辈开发者在实践中总结出来的经验教训,通过模式化的设计,可以减少代码的复杂性,提高代码的复用性和可维护性。设计模式的重要性在于,它们提供了一种通用的语言,使得开发者能够更有效地沟通和协作。
-
常见的设计模式分类:
- 创建型模式:关注对象的创建机制,使创建过程更加灵活。例如,单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)、原型模式(Prototype)。
- 结构型模式:关注类或对象的组合,封装复杂的关联,简化结构。例如,适配器模式(Adapter)、装饰器模式(Decorator)、代理模式(Proxy)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)、代理模式(Proxy)。
- 行为型模式:关注对象之间的责任分配,定义了算法的职责和通信。例如,策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、责任链模式(Chain of Responsibility)、备忘录模式(Memento)、解释器模式(Interpreter)、中介者模式(Mediator)、状态模式(State)。
-
应用场景和优势:
- 单例模式:确保一个类只有一个实例,并提供一个全局访问点,适用于需要控制资源访问的场景,如数据库连接池。
- 工厂方法模式:定义一个创建对象的接口,让子类决定实例化哪一个类,适用于需要创建复杂对象的场景,如图形界面组件。
- 装饰器模式:动态地给一个对象添加一些额外的职责,适用于需要扩展功能但不想修改现有代码的场景,如文本格式化。
- 观察者模式:定义对象间的一对多依赖,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新,适用于需要实时响应状态变化的场景,如天气预报应用。
-
设计模式示例:观察者模式 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时,所有观察者对象都会收到通知并自动更新。下面是一个简单的天气数据发布和订阅的例子。
Java浅色版本
1import java.util.ArrayList; 2import java.util.List; 3 4// 主题接口 5interface Subject { 6 void registerObserver(Observer o); 7 void removeObserver(Observer o); 8 void notifyObservers(); 9} 10 11// 观察者接口 12interface Observer { 13 void update(float temp, float humidity, float pressure); 14} 15 16// 具体主题 17class WeatherData implements Subject { 18 private List<Observer> observers; 19 private float temperature; 20 private float humidity; 21 private float pressure; 22 23 public WeatherData() { 24 observers = new ArrayList<>(); 25 } 26 27 public void registerObserver(Observer o) { 28 observers.add(o); 29 } 30 31 public void removeObserver(Observer o) { 32 observers.remove(o); 33 } 34 35 public void notifyObservers() { 36 for (Observer observer : observers) { 37 observer.update(temperature, humidity, pressure); 38 } 39 } 40 41 public void measurementsChanged() { 42 notifyObservers(); 43 } 44 45 public void setMeasurements(float temperature, float humidity, float pressure) { 46 this.temperature = temperature; 47 this.humidity = humidity; 48 this.pressure = pressure; 49 measurementsChanged(); 50 } 51} 52 53// 具体观察者 54class CurrentConditionsDisplay implements Observer { 55 @Override 56 public void update(float temp, float humidity, float pressure) { 57 System.out.println("Current conditions: " + temp + "F degrees and " + humidity + "% humidity"); 58 } 59}在这个例子中,
WeatherData是主题,负责维护观察者列表,并在测量数据变化时通知所有观察者。CurrentConditionsDisplay是一个具体的观察者,实现update方法来显示最新的天气数据。
通过深入研究和实践设计模式,开发者可以更好地设计出可扩展、可维护和可复用的软件系统。设计模式的学习是一个持续的过程,随着经验的积累,开发者会更加熟练地应用这些模式来解决复杂的设计问题。
相关文章:
Java面试题系列 - 第9天
题目:深入探讨Java中的设计模式及其应用场景 背景说明:设计模式是软件工程中解决问题的常见方案,它们提供了经过验证的模板,帮助开发者解决在软件设计过程中遇到的特定问题。在Java中,熟悉并正确应用设计模式能够显著…...
数据结构【顺序表】
目录 线性表 顺序表 概念与结构 分类 静态顺序表 动态顺序表 动态顺序表的实现 在头文件中创建结构体 初始化顺序表 销毁顺序表(可以留到后面再看) 尾插数据 申请空间 打印顺序表数据 头插数据 尾删除数据 头删除数据 在指定位置插…...
【JavaScript 报错】未捕获的类型错误:Uncaught TypeError
🔥 个人主页:空白诗 文章目录 一、错误原因分析1. 调用不存在的方法2. 访问未定义的属性3. 数据类型不匹配4. 函数参数类型不匹配 二、解决方案1. 检查方法和属性是否存在2. 使用可选链操作符3. 数据类型验证4. 函数参数类型检查 三、实例讲解四、总结 在…...
html+css+js随机验证码
随机画入字符、线条 源代码在图片后面 点赞❤️关注😍收藏⭐️ 互粉必回 图示 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"…...
WPS打开PDF文件的目录
WPS打开PDF文件的目录 其实WPS中PDF文件并没有像Word那样标准的目录,但是倒是有书签,和目录一个效果 点击左上角书签选项,或者使用Alt Shift 1快捷键即可...
常见 Web漏洞分析与防范研究
前言: 在当今数字化时代,Web应用程序扮演着重要的角色,为我们提供了各种在线服务和功能。然而,这些应用程序往往面临着各种潜在的安全威胁,这些威胁可能会导致敏感信息泄露、系统瘫痪以及其他不良后果。 SQL注入漏洞 …...
暗黑魅力:Xcode全面拥抱应用暗黑模式开发指南
暗黑魅力:Xcode全面拥抱应用暗黑模式开发指南 随着苹果在iOS 13和iPadOS 13中引入暗黑模式,用户可以根据自己的喜好或环境光线选择不同的界面主题。作为开发者,支持暗黑模式不仅能提升用户体验,还能彰显应用的专业性。Xcode提供了…...
【游戏引擎之路】登神长阶(七)——x86汇编学习:凡做难事,必有所得
5月20日-6月4日:攻克2D物理引擎。 6月4日-6月13日:攻克《3D数学基础》。 6月13日-6月20日:攻克《3D图形教程》。 6月21日-6月22日:攻克《Raycasting游戏教程》。 6月23日-7月1日:攻克《Windows游戏编程大师技巧》。 7月…...
在 Windows 平台搭建 MQTT 服务
引言 MQTT 是一种轻量级、基于发布/订阅模式的消息传输协议,旨在用极小的代码空间和网络带宽为物联网设备提供简单、可靠的消息传递服务。MQTT 经过多年的发展,如今已被广泛应用于资源开采、工业制造、移动通信、智能汽车等各行各业,使得 MQ…...
jdevelope安装
准备 1.jdk1.8(已经安装不做记录) 2.下载jdevelope安装包 3.安装包安装jdevelope开发工具 4.创建或导入项目 下载jdevelope安装包 官网下载地址:https://edelivery.oracle.com 安装包安装jdevelope开发工具 cmd管理员权限运行安装脚本…...
排序(一)——冒泡排序、直接插入排序、希尔排序(BubbleSOrt,InsertSort,ShellSort)
欢迎来到繁星的CSDN,本期的内容主要包括冒泡排序(BubbleSort),直接插入排序(InsertSort),以及插入排序进阶版希尔排序(ShellSort)。 废话不多说,直接上正题! 一、冒泡排序 冒泡排序…...
synchronized关键字详解(全面分析)
目录 synchronized关键字详解1、synchronized关键字简介2、synchronized作用和使用场景作用使用场景①、用在代码块上(类级别同步)②、用在代码块上(对象级别同步)③、用在普通方法上(对象级别同步)④、用在静态方法上(类级别同步)总结: 3、synchronized底层原理&am…...
数据建设实践之大数据平台(三)
安装hadoop 上传安装文件到/opt/software目录并解压 [bigdatanode101 software]$ tar -zxvf hadoop-3.3.5.tar.gz -C /opt/services/ 配置环境变量 [bigdatanode101 ~]$ sudo vim /etc/profile.d/bigdata_env.sh export JAVA_HOME/opt/services/jdk1.8.0_161 export ZK_HO…...
TypeScript中的交叉类型
交叉类型:将多个类型合并为一个类型,使用&符号连接。 type AProps { a: string }type BProps { b: number }type allProps AProps & BPropsconst Info: allProps {a: 小月月,b: 7} 我们可以看到交叉类型是结合两个属性的属性值,那…...
CNN -1 神经网络-概述2
CNN -1 神经网络-概述2 一:神经网络(operator)1> 线性层(Fully Connected Layer)2> 卷积层(Convolutional Layer)3> 池化层(Pooling Layer)4> 循环层(Recurrent Layer)5> 归一化层(Normalization Layer)6> 激活函数(Activation Function)7>…...
利用js实现图片压缩功能
图片压缩在众多应用场景中扮演着至关重要的角色,尤其是在客户端上传图片时。原始图片往往体积庞大,直接上传不仅消耗大量带宽资源,还可能导致上传速度缓慢,严重影响用户体验。因此,在图片上传至服务器前对其进行压缩处…...
2024.7.10 刷题总结
2024.7.10 **每日一题** 2970.统计移除递增子数组的数目 Ⅰ,这道题是一个考察双指针的题目,也考察了数组的基本性质。题目的意思是要统计有多少个子数组能满足移除后剩下的元素为严格递增的关系,刚开始没考虑到移除的元素要是连续的ÿ…...
ES6 async 函数详解 (十)
async 函数是什么?一句话,它就是 Generator 函数的语法糖。 const gen function* () {const f1 yield readFile(/etc/fstab);const f2 yield readFile(/etc/shells);console.log(f1.toString());console.log(f2.toString()); };const asyncReadFile …...
【安全设备】入侵检测
一、什么是入侵检测 入侵检测是一种网络安全技术,用于监测和识别对计算机系统或网络的恶意使用行为或未经授权的访问。入侵检测系统(IDS)是实现这一目标的技术手段,其主要目的是确保计算机系统的安全,通过及时发现并报…...
07浅谈大语言模型可调节参数tempreture
浅谈temperature 什么是temperature? temperature是大预言模型生成文本时常用的两个重要参数。它的作用体现在控制模型输出的确定性和多样性: 控制确定性: temperature参数可以控制模型生成文本的确定性,大部分模型中temperatur…...
3分钟掌握:如何在Windows上直接安装Android应用的终极方案
3分钟掌握:如何在Windows上直接安装Android应用的终极方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经遇到过这样的情况:手机上有…...
终极视频修复指南:如何使用Untrunc轻松恢复损坏的MP4/MOV文件
终极视频修复指南:如何使用Untrunc轻松恢复损坏的MP4/MOV文件 【免费下载链接】untrunc Restore a truncated mp4/mov. Improved version of ponchio/untrunc 项目地址: https://gitcode.com/gh_mirrors/un/untrunc 你是否曾经遇到过珍贵的视频文件突然无法播…...
Whitlow/218 Linker如何革新抗体药物开发中的稳定性与生产难题?
一、抗体工程领域面临何种关键性技术瓶颈?抗体药物作为生物制药领域最具前景的治疗方向之一,在肿瘤、自身免疫疾病和传染病等重大疾病治疗中展现出卓越疗效。然而,在抗体药物研发过程中,两个关键技术难题始终制约着其进一步发展&a…...
Fluent后处理效率翻倍:用View功能建立你的专属仿真报告视角库
Fluent后处理效率翻倍:用View功能建立你的专属仿真报告视角库 在仿真工程师的日常工作中,最耗时的往往不是计算本身,而是后处理阶段——反复调整视角、截图、标注、排版,只为生成一份清晰直观的报告。我曾参与过一个散热器优化项目…...
用PyTorch从零复现SiamFC:手把手教你搭建自己的单目标跟踪器(附完整代码)
用PyTorch从零复现SiamFC:手把手教你搭建自己的单目标跟踪器(附完整代码) 单目标跟踪是计算机视觉领域的经典问题之一,它的核心任务是在视频序列中持续定位特定目标的位置。想象一下这样的场景:你正在开发一个智能监控…...
2026届最火的六大AI辅助论文平台实测分析
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 基于自然语言处理技术的智能工具是AI写作软件,它能够辅助用户快速生成各类不同的…...
终极指南:QLVideo让macOS视频预览支持200+格式,Finder管理效率提升300%
终极指南:QLVideo让macOS视频预览支持200格式,Finder管理效率提升300% 【免费下载链接】QuickLookVideo This package allows macOS Finder to display thumbnails, static QuickLook previews, cover art and metadata for most types of video files. …...
前端Word文档生成革命:3分钟掌握纯JavaScript专业文档导出创新方案
前端Word文档生成革命:3分钟掌握纯JavaScript专业文档导出创新方案 【免费下载链接】DOCX.js Generate Microsoft Word DOCX files in pure client-side JavaScript. Try in Chrome 项目地址: https://gitcode.com/gh_mirrors/do/DOCX.js 还在为Word文档导出…...
noTunes:守护macOS专注体验的开源工具
noTunes:守护macOS专注体验的开源工具 【免费下载链接】noTunes A simple macOS application that will prevent iTunes or Apple Music from launching. 项目地址: https://gitcode.com/gh_mirrors/no/noTunes 在数字工作环境中,音乐应用的自动启…...
CMB2前端集成教程:将元框和表单带到网站前台
CMB2前端集成教程:将元框和表单带到网站前台 【免费下载链接】CMB2 CMB2 is a developers toolkit for building metaboxes, custom fields, and forms for WordPress that will blow your mind. 项目地址: https://gitcode.com/gh_mirrors/cm/CMB2 想要在Wo…...
