java2025年常见设计模式面试题
1. 请解释建造者模式(Builder Pattern)及其应用场景。
答案:
建造者模式用于创建一个复杂的对象,同时允许用户只通过指定复杂对象的类型和内容就能构建它们,隐藏了复杂的构建逻辑。
示例:
public class Car {private String engine;private String wheels;private String color;public Car(String engine, String wheels, String color) {this.engine = engine;this.wheels = wheels;this.color = color;}@Overridepublic String toString() {return "Car{" +"engine='" + engine + '\'' +", wheels='" + wheels + '\'' +", color='" + color + '\'' +'}';}
}public class CarBuilder {private String engine;private String wheels;private String color;public CarBuilder setEngine(String engine) {this.engine = engine;return this;}public CarBuilder setWheels(String wheels) {this.wheels = wheels;return this;}public CarBuilder setColor(String color) {this.color = color;return this;}public Car build() {return new Car(engine, wheels, color);}
}// 使用
Car car = new CarBuilder().setEngine("V8").setWheels("Alloy").setColor("Red").build();
System.out.println(car);
应用场景:
- 当对象的构建过程复杂,且需要逐步设置多个属性时。
- 当对象的构建逻辑可能变化时,使用建造者模式可以灵活调整。
2. 请解释适配器模式(Adapter Pattern)及其应用场景。
答案:
适配器模式用于将一个类的接口转换为客户期望的另一个接口,从而使原本不兼容的接口能够一起工作。
示例:
public interface MediaPlayer {void play(String audioType, String fileName);
}public interface AdvancedMediaPlayer {void playVlc(String fileName);void playMp4(String fileName);
}public class VlcPlayer implements AdvancedMediaPlayer {@Overridepublic void playVlc(String fileName) {System.out.println("Playing VLC file: " + fileName);}@Overridepublic void playMp4(String fileName) {throw new UnsupportedOperationException();}
}public class Mp4Player implements AdvancedMediaPlayer {@Overridepublic void playVlc(String fileName) {throw new UnsupportedOperationException();}@Overridepublic void playMp4(String fileName) {System.out.println("Playing MP4 file: " + fileName);}
}public class MediaAdapter implements MediaPlayer {private AdvancedMediaPlayer advancedMediaPlayer;public MediaAdapter(String audioType) {if (audioType.equalsIgnoreCase("vlc")) {advancedMediaPlayer = new VlcPlayer();} else if (audioType.equalsIgnoreCase("mp4")) {advancedMediaPlayer = new Mp4Player();}}@Overridepublic void play(String audioType, String fileName) {if (audioType.equalsIgnoreCase("vlc")) {advancedMediaPlayer.playVlc(fileName);} else if (audioType.equalsIgnoreCase("mp4")) {advancedMediaPlayer.playMp4(fileName);}}
}// 使用
MediaPlayer player = new MediaAdapter("vlc");
player.play("vlc", "sample.vlc");
应用场景:
- 当需要将第三方库或遗留代码集成到现有系统中时。
- 当需要扩展系统的功能,但不想修改现有代码时。
3. 请解释代理模式(Proxy Pattern)及其应用场景。
答案:
代理模式提供了一种代理对象,该对象内部含有对真实对象的引用,通过代理对象来间接访问真实对象,从而在不改变真实对象代码的情况下,添加一层间接层来控制对真实对象的访问。
示例:
public interface Image {void display();
}public class RealImage implements Image {private String fileName;public RealImage(String fileName) {this.fileName = fileName;loadFromDisk(fileName);}private void loadFromDisk(String fileName) {System.out.println("Loading " + fileName);}@Overridepublic void display() {System.out.println("Displaying " + fileName);}
}public class ProxyImage implements Image {private RealImage realImage;private String fileName;public ProxyImage(String fileName) {this.fileName = fileName;}@Overridepublic void display() {if (realImage == null) {realImage = new RealImage(fileName);}realImage.display();}
}// 使用
Image image = new ProxyImage("test.jpg");
image.display();
应用场景:
- 当需要延迟加载资源时(如图片)。
- 当需要控制对对象的访问时(如权限检查)。
4. 请解释模板方法模式(Template Method Pattern)及其应用场景。
答案:
模板方法模式定义了一个操作中的算法骨架,将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。
示例:
public abstract class Game {protected abstract void initialize();protected abstract void startPlay();protected abstract void endPlay();public final void play() {initialize();startPlay();endPlay();}
}public class Cricket extends Game {@Overrideprotected void initialize() {System.out.println("Cricket game initialization");}@Overrideprotected void startPlay() {System.out.println("Cricket game started");}@Overrideprotected void endPlay() {System.out.println("Cricket game finished");}
}public class Football extends Game {@Overrideprotected void initialize() {System.out.println("Football game initialization");}@Overrideprotected void startPlay() {System.out.println("Football game started");}@Overrideprotected void endPlay() {System.out.println("Football game finished");}
}// 使用
Game game = new Cricket();
game.play();
应用场景:
- 当多个子类共享相同的算法结构,但某些步骤需要根据子类不同而变化时。
- 当需要定义算法的骨架,但允许子类灵活实现某些步骤时。
5. 请解释门面模式(Facade Pattern)及其应用场景。
答案:
门面模式提供了一个统一的高层接口,用于访问子系统中的一群接口。它定义了一个高层接口,让子系统更容易使用。
示例:
public class SubSystemA {public void methodA() {System.out.println("SubSystemA methodA");}
}public class SubSystemB {public void methodB() {System.out.println("SubSystemB methodB");}
}public class SubSystemC {public void methodC() {System.out.println("SubSystemC methodC");}
}public class Facade {private SubSystemA a;private SubSystemB b;private SubSystemC c;public Facade() {a = new SubSystemA();b = new SubSystemB();c = new SubSystemC();}public void operation() {a.methodA();b.methodB();c.methodC();}
}// 使用
Facade facade = new Facade();
facade.operation();
应用场景:
- 当需要简化一个复杂子系统的使用时。
- 当需要提供一个统一的接口,隐藏子系统的复杂性时。
相关文章:
java2025年常见设计模式面试题
1. 请解释建造者模式(Builder Pattern)及其应用场景。 答案: 建造者模式用于创建一个复杂的对象,同时允许用户只通过指定复杂对象的类型和内容就能构建它们,隐藏了复杂的构建逻辑。 示例: public class C…...
探索CAMEL:揭开多智能体系统的神秘面纱
在人工智能领域,多智能体系统(Multi-Agent Systems, MAS)一直是一个充满活力和潜力的研究方向。随着大语言模型(LLM)的快速发展,智能体之间的协作与交互变得更加复杂和智能。今天,我们要介绍的是一个名为CAMEL(Communicative Agents for “Mind” Exploration of Large…...
el-pagination的使用说明
<el-paginationv-model:current-page"pageNo" //当前第几页v-model:page-size"pageSize" //每页显示多少条数据:page-sizes"[10, 20, 30]" //控制每页显示的条数:small"true" //控制分页器大小:disabled&quo…...
UniApp 运行的微信小程序如何进行深度优化
UniApp 运行的微信小程序如何进行深度优化 目录 引言性能优化 1. 减少包体积2. 优化页面加载速度3. 减少 setData 调用4. 使用分包加载 代码优化 1. 减少不必要的代码2. 使用条件编译3. 优化图片资源 用户体验优化 1. 优化交互体验2. 预加载数据3. 使用骨架屏 调试与监控 1. …...
Web Worker如何在本地使用
首先了解一下什么是Web Worker Web Worker 是一种在后台线程中运行 JavaScript 的机制,允许你在不阻塞主线程的情况下执行耗时的任务。这对于保持网页的响应性和流畅性非常重要,特别是在需要进行复杂计算或大量数据处理时。 主要特点 多线程࿱…...
[原创](Modern C++)现代C++的关键性概念: 改掉new习惯, 尽情地使用智能分配内存
[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、C …...
C/C++中使用CopyFile、CopyFileEx原理、用法、区别及分别在哪些场景使用
文章目录 1. CopyFile原理函数原型返回值用法示例适用场景 2. CopyFileEx原理函数原型返回值用法示例适用场景 3. 核心区别4. 选择建议5. 常见问题6.区别 在Windows系统编程中,CopyFile和CopyFileEx是用于文件复制的两个API函数。它们的核心区别在于功能扩展性和控制…...
android studio开发文档
android基本样式 1.文本 2.设置文本大小 3.字体颜色 背景 资源文件 xml’引用资源文件 4.视图宽高 5.间距 6.对齐方式 常用布局 1.linearLayout线性布局 2.相对布局 RelativeLayout 3.网格布局GridLayout 4.scrollview滚动视图 Button 点击事件与长按事件 长按 按钮禁用与…...
计算机网络笔记(二)——1.2互联网概述
1.2.1网络的网络 起源于美国的互联网现已发展成为世界上最大的覆盖全球的计算机网络。 下面,我们先来看看关于网络、互连网、互联网(因特网)的一些基本概念。为了方便,后面我们所称呼的"网络"往往就是"计算机网络",而不是电信网或有…...
Ubuntu 24.04.2 允许 root 登录桌面、 ssh 远程、允许 Ubuntu 客户机与主机拖拽传递文件
允许 root 登录桌面 修改 /etc/pam.d/gdm-autologin , /etc/pam.d/gdm-password 加 # 以注释掉 auth required pam_succeed_if.so user ! root quiet_success 允许 root 通过 ssh 登录 修改 /etc/ssh/sshd_config ... #PermitRootLogin prohibit-password PermitRootLogin …...
day18-后端Web开发——Maven高级
目录 Maven高级1. 分模块设计与开发1.1 介绍1.2 实践1.2.1 分析1.2.2 实现 1.3 总结 2. 继承与聚合2.1 继承2.1.1 继承关系2.1.1.1 思路分析2.1.1.2 实现2.1.2 版本锁定2.1.2.1 场景2.1.2.2 介绍2.1.2.3 实现2.1.2.4 属性配置 2.2 聚合2.2.1 介绍2.2.2 实现 2.3 继承与聚合对比…...
华为hcia——Datacom实验指南——三层交换和ARP的工作原理
什么是三层交换 三层交换是指连接在同一台三层交换机上,不同vlan用户,不同网段ip,通过vlanif接口进行数据交换。 什么是ARP协议 通过网络层的ip地址解析成数据链路层的mac地址。 说白了就是通过目标ip地址去问他对应的mac地址是多少。 A…...
重构谷粒商城09:人人开源框架的快速入门
谷粒商城09——人人开源框架的快速入门 前言:这个系列将使用最前沿的cursor作为辅助编程工具,来快速开发一些基础的编程项目。目的是为了在真实项目中,帮助初级程序员快速进阶,以最快的速度,效率,快速进阶…...
用友 U8出入库查询SQL 连接UNION ALL
-- 销售出库单查询 SELECT 销售出库单 AS 单据类型, a.cCode AS 单号, a.dDate AS 日期, a.cMaker AS 制单人, a.cHandler AS 审核人, a.dVeriDate AS 审核日期, b.cInvCode AS 存货编码, b.iQuantity AS 数量, b.cBatch AS 批号, c.…...
【大模型】WPS 接入 DeepSeek-R1详解,打造全能AI办公助手
目录 一、前言 二、WPS接入AI工具优势 三、WPS接入AI工具两种方式 3.1 手动配置的方式 3.2 Office AI助手 四、WPS手动配置方式接入AI大模型 4.1 安装VBA插件 4.1.1 下载VBA插件并安装 4.2 配置WPS 4.3 WPS集成VB 4.4 AI助手效果测试 4.5 配置模板文…...
Neo4j 数据库备份
将包括系统数据库在内的所有数据库的最近备份存储在一个安全的位置是非常重要的。这确保了在发生数据丢失或损坏时,能够迅速恢复数据库到最近的状态,减少可能的业务影响。对于不同的数据库环境(开发、测试或生产),根据…...
配置 Thunderbird 以使用 QQ 邮箱
配置 Thunderbird 以使用 QQ 邮箱 本片文章的操作系统为 windws 10 ,thunder bird 客户端版本为 128.7.1esr(64位)。注意到其他文章的图片中 thunder bird 的 ui 界面和我这个不一样,导致看起来不太方便,所以这里写一篇博客。不同版本的 thu…...
Hadoop安装文件解压报错:无法创建符号链接。。。
您可能需要管理员身份运行winRAR; 客户端没有所需的特权; cmd进入该目录下,输入命令(本地解压):start winrar x -y hadoop-2.10.1.tar.gz...
C++蓝桥杯皮亚诺曲线距离求解
C蓝桥杯皮亚诺曲线距离求解 一、题目概述二、解题分析2.1解题思路2.2k值范围限制 三、实现代码四、代码测试4.1蓝桥杯测试平台4.2直接传入原始输入的k值4.3限制k值大小4.4pow函数求整数高次幂存在误差4.5满分代码 附录error: ‘long long int y1’ redeclared as different kin…...
【语料数据爬虫】Python爬虫|批量采集工作报告数据(1)
前言 本文是该专栏的第4篇,后面会持续分享Python爬虫采集各种语料数据的的干货知识,值得关注。 在本文中,笔者将主要来介绍基于Python,来实现批量采集“工作报告”数据。同时,本文也是采集“工作报告”数据系列的第1篇。 采集相关数据的具体细节部分以及详细思路逻辑,笔…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
