持续总结中!2024年面试必问 20 道设计模式面试题(五)
上一篇地址:持续总结中!2024年面试必问 20 道设计模式面试题(四)-CSDN博客
九、请解释代理模式(Proxy Pattern)及其类型。
代理模式(Proxy Pattern)是一种结构设计模式,它为另一个对象提供一个代替或占位符的对象,以便控制对它的访问。代理模式可以在不直接与实际对象交互的情况下,提供对目标对象的间接访问。这种模式在以下情况下非常有用:
- 当需要对目标对象的访问进行控制时。
- 当需要在访问对象时执行额外的操作,如延迟初始化、访问前的权限检查等。
- 当需要为远程对象或复杂对象提供一种更简单的接口时。
代理模式的组成部分:
- 主题接口(Subject Interface):定义了真实对象和代理对象的共同接口,这样代理可以代替真实对象被使用。
- 真实主题(Real Subject):定义了代理所代表的真实对象,实现了主题接口。
- 代理(Proxy):包含对真实主题的引用,实现了相同的主题接口,并控制对真实主题的访问。
代理模式的类型:
-
远程代理(Remote Proxy):为位于不同地址空间的对象提供代理,隐藏对象位于远程地址空间的事实。它通常用在分布式系统中。
-
虚拟代理(Virtual Proxy):延迟创建开销较大的对象。当第一次需要时,虚拟代理会加载并初始化真实对象。
-
保护代理(Protection Proxy):控制对原始对象的访问,根据不同的访问权限提供不同的访问策略。
-
智能引用(Smart Reference):在访问对象时执行额外的操作,如引用计数、线程安全检查等。
-
缓存代理(Caching Proxy):为开销较大的操作结果提供存储,当同样的操作请求发生时,可以直接使用缓存结果,避免重复计算。
-
同步代理(Synchronization Proxy):为多个线程提供同步访问某个对象的代理,确保在同一时间只有一个线程可以访问对象。
-
防火墙代理(Firewall Proxy):在网络中控制对某些资源的访问,提供安全控制。
-
复制代理(Copy Proxy):在复制一个复杂对象时,复制代理可以优化复制过程,例如按需复制。
示例:
假设我们有一个大型图像处理对象,我们希望延迟其加载,直到真正需要显示图像时。使用虚拟代理模式,我们可以这样实现:
// 主题接口
interface ImageLoader {void load();void display();
}// 真实主题
class RealImageLoader implements ImageLoader {private String imagePath;public RealImageLoader(String imagePath) {this.imagePath = imagePath;}@Overridepublic void load() {System.out.println("Loading image from " + imagePath);}@Overridepublic void display() {System.out.println("Displaying image");}
}// 代理
class ImageProxy implements ImageLoader {private RealImageLoader realImageLoader;private String imagePath;public ImageProxy(String imagePath) {this.imagePath = imagePath;}@Overridepublic void load() {if (realImageLoader == null) {realImageLoader = new RealImageLoader(imagePath);realImageLoader.load();}}@Overridepublic void display() {if (realImageLoader != null) {realImageLoader.display();}}
}// 客户端代码
ImageLoader imageLoader = new ImageProxy("path/to/image.jpg");
imageLoader.display(); // 此时才加载图像
在这个例子中,ImageProxy 类作为 RealImageLoader 的代理,延迟了图像的加载过程,直到 display() 方法被调用时才真正加载图像。这展示了代理模式如何用于控制对资源的访问和执行延迟初始化。
十、什么是命令模式(Command Pattern)?它在实际开发中如何使用?
命令模式(Command Pattern)是一种行为设计模式,它将请求或操作封装为一个对象。这种模式的主要目的是将发起请求的对象(调用者)与执行请求的对象(接收者)解耦,从而让不同的请求可以以统一的方式处理,例如执行、排队、记录日志或撤销等。
命令模式的组成部分:
- 命令接口(Command Interface):声明执行操作的方法,通常是一个
execute()方法。 - 具体命令(Concrete Command):实现命令接口,对应具体的操作,包含接收者对象的引用,并调用接收者的方法。
- 调用者(Invoker):要求命令对象执行请求,通常包含一个或多个命令对象,并可以触发命令的执行。
- 接收者(Receiver):知道如何实施与执行一个请求相关的操作,不直接与调用者或命令对象交互。
- 客户端(Client):创建具体的命令对象,并设置它的接收者,然后将命令对象传给调用者。
命令模式在实际开发中的使用:
-
撤销操作:命令模式可以很容易地实现撤销功能。通过维护一个命令的历史记录,可以逐个撤销命令的效果。
-
日志记录:命令对象可以被用来记录操作历史,这对于审计和调试非常有用。
-
事务支持:命令模式可以支持事务性操作,确保一系列命令作为一个整体被执行或回滚。
-
宏命令:可以将多个命令组合成一个宏命令,作为一个单独的操作执行。
-
异步命令执行:命令模式可以用于实现异步操作,命令对象可以被发送到一个后台线程执行。
-
安全性:通过命令模式,可以控制哪些操作可以被执行,哪些不可以,从而提高系统的安全性。
示例:
假设我们有一个简单的文本编辑器,它支持撤销插入文本的操作。使用命令模式,我们可以这样实现:
// 命令接口
interface Command {void execute();void undo();
}// 接收者
class TextEditor {private StringBuilder content = new StringBuilder();public void type(String words) {content.append(words);}public void remove(int numberOfChars) {content.delete(content.length() - numberOfChars, content.length());}public String getContent() {return content.toString();}
}// 具体命令
class InsertCommand implements Command {private TextEditor editor;private String words;private int position;public InsertCommand(TextEditor editor, String words) {this.editor = editor;this.words = words;this.position = editor.getContent().length();}@Overridepublic void execute() {editor.type(words);}@Overridepublic void undo() {editor.remove(words.length());}
}// 调用者
class CommandInvoker {private Stack<Command> commandHistory = new Stack<>();public void setCommand(Command command) {command.execute();commandHistory.push(command);}public void undo() {if (!commandHistory.isEmpty()) {Command command = commandHistory.pop();command.undo();}}
}// 客户端代码
TextEditor editor = new TextEditor();
CommandInvoker invoker = new CommandInvoker();invoker.setCommand(new InsertCommand(editor, "Hello"));
invoker.setCommand(new InsertCommand(editor, " World"));
System.out.println(editor.getContent()); // 输出: Hello Worldinvoker.undo(); // 撤销插入 " World"
System.out.println(editor.getContent()); // 输出: Hello
在这个例子中,InsertCommand 是一个具体命令,它封装了插入文本的操作。TextEditor 是接收者,执行实际的文本插入和删除操作。CommandInvoker 是调用者,它维护了一个命令的历史记录,并可以执行撤销操作。客户端代码通过调用者来执行命令和撤销操作,展示了命令模式如何在实际开发中使用。
相关文章:
持续总结中!2024年面试必问 20 道设计模式面试题(五)
上一篇地址:持续总结中!2024年面试必问 20 道设计模式面试题(四)-CSDN博客 九、请解释代理模式(Proxy Pattern)及其类型。 代理模式(Proxy Pattern)是一种结构设计模式,…...
嵌入式面经111题答案汇总(含技术答疑)_嵌入式项目源码分享
111道嵌入式面试题答案汇总专栏链接(承诺免费技术答疑) --> 《嵌入式/C面试题解析大全》 1、简介 本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业工作经验,整理超全面111道嵌入式面试…...
鸿蒙开发通信与连接:【@ohos.connectedTag (有源标签)】
有源标签 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import connectedTag from ohos.connectedTag;connectedTag.init init(): boolean 初始化有源标签芯片。 需要权限&#…...
在线编程工具
1.C语言在线编程 https://www.jyshare.com/compile/11/ 2.java在线编程 https://www.w3cschool.cn/tryrun/runcode1?langjava 3.Python在线编程 https://www.python123.io/index/playground/python?ivk_sa1024320u...
NSSCTF中的[WUSTCTF 2020]朴实无华、[FSCTF 2023]源码!启动! 、[LitCTF 2023]Flag点击就送! 以及相关知识点
目录 [WUSTCTF 2020]朴实无华 [FSCTF 2023]源码!启动! [LitCTF 2023]Flag点击就送! 相关知识点 1.intval 绕过 绕过的方式: 2.session伪造攻击 [WUSTCTF 2020]朴实无华 1.进入页面几乎没什么可用的信息,所以想到使用dis…...
Vue49-props属性
一、当同一个组件标签被使用多次 因为data属性写的是函数形式! 二、需求:老王也想用<Student>组件,但是需要动态把老王想要的值传进来。 2-1、使用props属性接收参数 使用props属性,接收的这三个参数,是被保存在…...
CVE-2020-1957 漏洞复现
先声明一下,免杀还是会更的,不过中间可能会穿插一下渗透的内容!!! 踩坑点: 在一开始翻阅了CSDN之后,发现不同文章之间存在出入,于是最后去了CVE的官方文档,和参考一些国…...
网工内推 | 中国电信、香港宽频系统工程师,CCIE认证优先,最高年薪25w
01 中国电信股份有限公司浙江分公司 🔷招聘岗位:系统架构师 🔷岗位职责: 1、做好客户网络和信息安全产品的解决方案支撑、交付及后续运营维护,做好相关产数项目的支撑。 2、根据信息安全管理要求,负责客户…...
LLVM后端 td文件 tablegen 模式匹配 寄存器 指令集 calling convention
目录 一、寄存器 1.1 寄存器定义 1.2 寄存器分类 二、指令集 2.1 指令集定义 2.2 模式匹配 2.2.1 PatFrags与PatFrag 2.2.2 OutPatFrag 2.2.3 PatLeaf 2.2.4 ImmLeaf 2.2.5 IntImmLeaf和FPImmLeaf 2.2.6 Pat 2.2.7 ComplexPattern 2.3 指令合法化 2.3.1 Promote…...
嵌入式交叉编译:frp
参考 LINUX FRP下载编译_linux编译frpc-CSDN博客 编译 make -f Makefile.cross-compiles 检查 $ make -f Makefile.cross-compiles Build darwin-amd64... Build darwin-amd64 done Build darwin-arm64... Build darwin-arm64 done Build freebsd-amd64... Build freebsd-…...
SpringBoot实现的大文件上传
前言 大文件分片上传和断点续传是为了解决在网络传输过程中可能遇到的问题,以提高文件传输的效率和稳定性。 首先,大文件分片上传是将大文件分割成较小的片段进行上传。这样做的好处是可以减少单个文件的传输时间,因为较小的文件片段更容易快…...
【Python高级编程】用 Matplotlib 绘制迷人的图表
用 Matplotlib 绘制迷人的图表 引言 Matplotlib 是 Python 中广泛使用的绘图库,用于创建各种图表和可视化。本文将逐步指导您使用 Matplotlib 绘制基本图表,包括折线图、条形图和散点图。 安装 Matplotlib 使用 pip 安装 Matplotlib: pi…...
【UML用户指南】-19-对基本行为建模-用例图
目录 1、组成结构 2、表示法 3、一般用法 3.1、对主题的语境建模 3.2、对主题的需求建模 4、常用建模技术 4.1、对系统的语境建模 4.1.1、设计过程 4.2、对系统的需求建模 4.2.1、设计过程: 5、正向工程 UML 中的用例图是对系统的动态方面建模的 5 种图之…...
mysql密码过期的修改(Your password has expired. ..)
参考文章:mysql密码过期的修改方法(your password has expired)_我是知青-RuoYi 若依 (csdn.net) 问题:Your password has expired. To log inyou must change it using a clientthat supports expired passwords. 解决方式&…...
vivado SLR
描述 超级逻辑区(SLR)是包含在堆叠硅中的单个FPGA芯片 互连(SSI)设备。堆叠式硅互连(SSI)技术使用无源硅 具有微凸块和硅通孔(TSV)的内插器,用于组合多个FPGA管芯 切片&a…...
【CSS】深入了解圆角属性border-radius
border-radius 是 CSS 中的一个非常有用的属性,它允许你创建具有圆角边框的元素。这个属性可以应用于一个元素的四个角,或者分别应用于每个角。下面我们将深入了解 border-radius 的使用方法和一些高级技巧。 基本用法 你可以通过为 border-radius 指定…...
LabVIEW与C#的区别及重新开发自动测试程序的可行性分析
LabVIEW和C#是两种广泛使用的编程语言,各自有不同的应用领域和特点。本文将详细比较LabVIEW与C#在自动测试程序开发中的区别,并分析将已完成的LabVIEW自动测试程序重新用C#开发的合理性。本文帮助评估这种转换的必要性和潜在影响。 LabVIEW与C#的区别 开…...
人工智能—美国加利福尼亚州房价预测实战
引言 在当今快速发展的房地产市场中,房价预测已成为一个至关重要的领域。它不仅关系到投资者的决策,也直接影响到普通购房者的生活质量。特别是在美国加利福尼亚州,这个以其高房价和房地产市场的波动性而闻名的地方,准确的房价预…...
python pandas处理股票量化数据:笔记2
有一个同学用我的推荐链接注册了tushare社区帐号https://tushare.pro/register?reg671815,现在有了170分积分。目前使用数据的频率受限制。不过可以在调试期间通过python控制台获取数据,将数据保存在本地以后使用不用高频率访问tushare数据接口…...
enum库
Python enum 模块教程 enum 是 Python 3.4 引入的一个模块,用于定义枚举类型。枚举类型是一种特殊的数据类型,由一组命名的值组成,这些值称为枚举成员。使用 enum 可以提高代码的可读性和可维护性,特别是在处理一组相关的常量值时…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
