当前位置: 首页 > news >正文

持续总结中!2024年面试必问 20 道设计模式面试题(五)

上一篇地址:持续总结中!2024年面试必问 20 道设计模式面试题(四)-CSDN博客

九、请解释代理模式(Proxy Pattern)及其类型。

代理模式(Proxy Pattern)是一种结构设计模式,它为另一个对象提供一个代替或占位符的对象,以便控制对它的访问。代理模式可以在不直接与实际对象交互的情况下,提供对目标对象的间接访问。这种模式在以下情况下非常有用:

  • 当需要对目标对象的访问进行控制时。
  • 当需要在访问对象时执行额外的操作,如延迟初始化、访问前的权限检查等。
  • 当需要为远程对象或复杂对象提供一种更简单的接口时。

代理模式的组成部分:

  1. 主题接口(Subject Interface):定义了真实对象和代理对象的共同接口,这样代理可以代替真实对象被使用。
  2. 真实主题(Real Subject):定义了代理所代表的真实对象,实现了主题接口。
  3. 代理(Proxy):包含对真实主题的引用,实现了相同的主题接口,并控制对真实主题的访问。

代理模式的类型:

  1. 远程代理(Remote Proxy):为位于不同地址空间的对象提供代理,隐藏对象位于远程地址空间的事实。它通常用在分布式系统中。

  2. 虚拟代理(Virtual Proxy):延迟创建开销较大的对象。当第一次需要时,虚拟代理会加载并初始化真实对象。

  3. 保护代理(Protection Proxy):控制对原始对象的访问,根据不同的访问权限提供不同的访问策略。

  4. 智能引用(Smart Reference):在访问对象时执行额外的操作,如引用计数、线程安全检查等。

  5. 缓存代理(Caching Proxy):为开销较大的操作结果提供存储,当同样的操作请求发生时,可以直接使用缓存结果,避免重复计算。

  6. 同步代理(Synchronization Proxy):为多个线程提供同步访问某个对象的代理,确保在同一时间只有一个线程可以访问对象。

  7. 防火墙代理(Firewall Proxy):在网络中控制对某些资源的访问,提供安全控制。

  8. 复制代理(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)是一种行为设计模式,它将请求或操作封装为一个对象。这种模式的主要目的是将发起请求的对象(调用者)与执行请求的对象(接收者)解耦,从而让不同的请求可以以统一的方式处理,例如执行、排队、记录日志或撤销等。

命令模式的组成部分:

  1. 命令接口(Command Interface):声明执行操作的方法,通常是一个 execute() 方法。
  2. 具体命令(Concrete Command):实现命令接口,对应具体的操作,包含接收者对象的引用,并调用接收者的方法。
  3. 调用者(Invoker):要求命令对象执行请求,通常包含一个或多个命令对象,并可以触发命令的执行。
  4. 接收者(Receiver):知道如何实施与执行一个请求相关的操作,不直接与调用者或命令对象交互。
  5. 客户端(Client):创建具体的命令对象,并设置它的接收者,然后将命令对象传给调用者。

命令模式在实际开发中的使用:

  1. 撤销操作:命令模式可以很容易地实现撤销功能。通过维护一个命令的历史记录,可以逐个撤销命令的效果。

  2. 日志记录:命令对象可以被用来记录操作历史,这对于审计和调试非常有用。

  3. 事务支持:命令模式可以支持事务性操作,确保一系列命令作为一个整体被执行或回滚。

  4. 宏命令:可以将多个命令组合成一个宏命令,作为一个单独的操作执行。

  5. 异步命令执行:命令模式可以用于实现异步操作,命令对象可以被发送到一个后台线程执行。

  6. 安全性:通过命令模式,可以控制哪些操作可以被执行,哪些不可以,从而提高系统的安全性。

示例:

假设我们有一个简单的文本编辑器,它支持撤销插入文本的操作。使用命令模式,我们可以这样实现:

// 命令接口
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 道设计模式面试题(五)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 20 道设计模式面试题&#xff08;四&#xff09;-CSDN博客 九、请解释代理模式&#xff08;Proxy Pattern&#xff09;及其类型。 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构设计模式&#xff0c…...

嵌入式面经111题答案汇总(含技术答疑)_嵌入式项目源码分享

111道嵌入式面试题答案汇总专栏链接&#xff08;承诺免费技术答疑&#xff09; --> 《嵌入式/C面试题解析大全》 1、简介 本人是2020年毕业于广东工业大学研究生&#xff1a;许乔丹&#xff0c;有国内大厂CVTE和世界500强企业工作经验&#xff0c;整理超全面111道嵌入式面试…...

鸿蒙开发通信与连接:【@ohos.connectedTag (有源标签)】

有源标签 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 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]源码&#xff01;启动! [LitCTF 2023]Flag点击就送&#xff01; 相关知识点 1.intval 绕过 绕过的方式&#xff1a; 2.session伪造攻击 [WUSTCTF 2020]朴实无华 1.进入页面几乎没什么可用的信息&#xff0c;所以想到使用dis…...

Vue49-props属性

一、当同一个组件标签被使用多次 因为data属性写的是函数形式&#xff01; 二、需求&#xff1a;老王也想用<Student>组件&#xff0c;但是需要动态把老王想要的值传进来。 2-1、使用props属性接收参数 使用props属性&#xff0c;接收的这三个参数&#xff0c;是被保存在…...

CVE-2020-1957 漏洞复现

先声明一下&#xff0c;免杀还是会更的&#xff0c;不过中间可能会穿插一下渗透的内容&#xff01;&#xff01;&#xff01; 踩坑点&#xff1a; 在一开始翻阅了CSDN之后&#xff0c;发现不同文章之间存在出入&#xff0c;于是最后去了CVE的官方文档&#xff0c;和参考一些国…...

网工内推 | 中国电信、香港宽频系统工程师,CCIE认证优先,最高年薪25w

01 中国电信股份有限公司浙江分公司 &#x1f537;招聘岗位&#xff1a;系统架构师 &#x1f537;岗位职责&#xff1a; 1、做好客户网络和信息安全产品的解决方案支撑、交付及后续运营维护&#xff0c;做好相关产数项目的支撑。 2、根据信息安全管理要求&#xff0c;负责客户…...

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实现的大文件上传

前言 大文件分片上传和断点续传是为了解决在网络传输过程中可能遇到的问题&#xff0c;以提高文件传输的效率和稳定性。 首先&#xff0c;大文件分片上传是将大文件分割成较小的片段进行上传。这样做的好处是可以减少单个文件的传输时间&#xff0c;因为较小的文件片段更容易快…...

【Python高级编程】用 Matplotlib 绘制迷人的图表

用 Matplotlib 绘制迷人的图表 引言 Matplotlib 是 Python 中广泛使用的绘图库&#xff0c;用于创建各种图表和可视化。本文将逐步指导您使用 Matplotlib 绘制基本图表&#xff0c;包括折线图、条形图和散点图。 安装 Matplotlib 使用 pip 安装 Matplotlib&#xff1a; pi…...

【UML用户指南】-19-对基本行为建模-用例图

目录 1、组成结构 2、表示法 3、一般用法 3.1、对主题的语境建模 3.2、对主题的需求建模 4、常用建模技术 4.1、对系统的语境建模 4.1.1、设计过程 4.2、对系统的需求建模 4.2.1、设计过程&#xff1a; 5、正向工程 UML 中的用例图是对系统的动态方面建模的 5 种图之…...

mysql密码过期的修改(Your password has expired. ..)

参考文章&#xff1a;mysql密码过期的修改方法&#xff08;your password has expired&#xff09;_我是知青-RuoYi 若依 (csdn.net) 问题&#xff1a;Your password has expired. To log inyou must change it using a clientthat supports expired passwords. 解决方式&…...

vivado SLR

描述 超级逻辑区&#xff08;SLR&#xff09;是包含在堆叠硅中的单个FPGA芯片 互连&#xff08;SSI&#xff09;设备。堆叠式硅互连&#xff08;SSI&#xff09;技术使用无源硅 具有微凸块和硅通孔&#xff08;TSV&#xff09;的内插器&#xff0c;用于组合多个FPGA管芯 切片&a…...

【CSS】深入了解圆角属性border-radius

border-radius 是 CSS 中的一个非常有用的属性&#xff0c;它允许你创建具有圆角边框的元素。这个属性可以应用于一个元素的四个角&#xff0c;或者分别应用于每个角。下面我们将深入了解 border-radius 的使用方法和一些高级技巧。 基本用法 你可以通过为 border-radius 指定…...

LabVIEW与C#的区别及重新开发自动测试程序的可行性分析

LabVIEW和C#是两种广泛使用的编程语言&#xff0c;各自有不同的应用领域和特点。本文将详细比较LabVIEW与C#在自动测试程序开发中的区别&#xff0c;并分析将已完成的LabVIEW自动测试程序重新用C#开发的合理性。本文帮助评估这种转换的必要性和潜在影响。 LabVIEW与C#的区别 开…...

人工智能—美国加利福尼亚州房价预测实战

引言 在当今快速发展的房地产市场中&#xff0c;房价预测已成为一个至关重要的领域。它不仅关系到投资者的决策&#xff0c;也直接影响到普通购房者的生活质量。特别是在美国加利福尼亚州&#xff0c;这个以其高房价和房地产市场的波动性而闻名的地方&#xff0c;准确的房价预…...

python pandas处理股票量化数据:笔记2

有一个同学用我的推荐链接注册了tushare社区帐号https://tushare.pro/register?reg671815&#xff0c;现在有了170分积分。目前使用数据的频率受限制。不过可以在调试期间通过python控制台获取数据&#xff0c;将数据保存在本地以后使用不用高频率访问tushare数据接口&#xf…...

enum库

Python enum 模块教程 enum 是 Python 3.4 引入的一个模块&#xff0c;用于定义枚举类型。枚举类型是一种特殊的数据类型&#xff0c;由一组命名的值组成&#xff0c;这些值称为枚举成员。使用 enum 可以提高代码的可读性和可维护性&#xff0c;特别是在处理一组相关的常量值时…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...