【设计模式】结构型模式(二):代理模式

结构型模式(二):代理模式

  • 3.代理模式(Proxy)
    • 3.1 主要特点
    • 3.2 组成部分
    • 3.3 示例代码
      • 3.3.1 Subject 接口
      • 3.3.2 RealSubject 实际对象
      • 3.3.3 Proxy 代理对象
      • 3.3.4 客户端代码
      • 3.3.5 运行结果
    • 3.4 总结

3.代理模式(Proxy)

代理模式Proxy Pattern)是一种结构型设计模式,它允许你提供一个代理对象来控制对某个对象的访问。代理对象可以执行一些额外的操作,如 权限检查日志记录延迟初始化 等,然后再将请求转发给实际的对象。

3.1 主要特点

  • 控制访问:代理对象可以控制对实际对象的访问,增加额外的功能。
  • 透明性:客户端代码可以通过代理对象来访问实际对象,而不需要知道实际对象的存在。
  • 灵活性:可以在不修改客户端代码的情况下,动态地添加或修改代理对象的行为。

3.2 组成部分

  • Subject主题接口
    • 定义了实际对象和代理对象 共同的接口,使得客户端可以使用相同的接口来访问实际对象和代理对象。
  • RealSubject实际对象
    • 实现了主题接口,提供了实际的业务逻辑。
  • Proxy代理对象
    • 也实现了主题接口,持有一个实际对象的引用
    • 在调用实际对象的方法前后,可以执行额外的操作。

3.3 示例代码

假设我们有一个 Image 接口,用于显示图片。为了提高性能,我们使用代理模式来实现图片的延迟加载。

3.3.1 Subject 接口

// Subject 接口
interface Image {void display();
}
  • Image 接口定义了 display 方法,表示显示图片的行为。

3.3.2 RealSubject 实际对象

// RealSubject 实际对象
class RealImage implements Image {private String filename;public RealImage(String filename) {this.filename = filename;loadFromDisk();}@Overridepublic void display() {System.out.println("Displaying " + filename);}private void loadFromDisk() {System.out.println("Loading " + filename);}
}
  • RealImage 类实现了 Image 接口,提供了实际的图片 加载显示 功能。
  • 在构造方法中,图片被加载到内存中。

3.3.3 Proxy 代理对象

// Proxy 代理对象
class ImageProxy implements Image {private RealImage realImage;private String filename;public ImageProxy(String filename) {this.filename = filename;}@Overridepublic void display() {if (realImage == null) {realImage = new RealImage(filename);}realImage.display();}
}
  • ImageProxy 类也实现了 Image 接口,持有一个 RealImage 对象的引用
  • display 方法中,如果 realImage 为空,则创建 RealImage 对象并加载图片;否则,直接调用 realImagedisplay 方法。

3.3.4 客户端代码

// 客户端代码
public class ProxyPatternExample {public static void main(String[] args) {Image image1 = new ImageProxy("image1.jpg");Image image2 = new ImageProxy("image2.jpg");image1.display(); // 第一次调用,会加载图片image1.display(); // 第二次调用,不会重新加载图片image2.display(); // 第一次调用,会加载图片image2.display(); // 第二次调用,不会重新加载图片}
}
  • 客户端代码通过 ImageProxy 对象来访问图片。
  • 第一次调用 display 方法时,图片会被加载到内存中;后续调用时,图片已经加载,不会再重新加载。

3.3.5 运行结果

Loading image1.jpg
Displaying image1.jpg
Displaying image1.jpg
Loading image2.jpg
Displaying image2.jpg
Displaying image2.jpg

3.4 总结

  • 优点
    • 延迟初始化:只有在需要时才加载和初始化实际对象,提高了性能。
    • 控制访问:可以在代理对象中添加额外的逻辑,如权限检查、日志记录等。
    • 透明性:客户端代码可以通过代理对象访问实际对象,而不需要知道实际对象的存在。
  • 缺点
    • 复杂性:增加了额外的类和对象,可能会使代码变得复杂。
    • 性能开销:每次调用方法时都需要通过代理对象,可能会有额外的性能开销。

通过代理模式,可以在不修改客户端代码的情况下,动态地添加或修改对象的行为,提高系统的灵活性和可维护性。

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

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

相关文章

第二十八章 Vue之自定义指令

目录 一、引言 二、自定义指令的注册和使用方式 2.1. 自定义指令-全局注册使用 2.2. 自定义指令-局部注册使用 三、自定义指令完整代码 3.1. 自定义指令全局注册/使用 3.1.1. main.js 3.1.2. App.vue 3.2. 自定义指令局部注册/使用 3.2.1. main.js 3.2.2. App.vue …

Charles简单压力测试

1.接口请求次数,并发量,请求延迟时间均可配置 1.1选中需要进行测试的接口,鼠标右键选中【repeat advance】 2.设置并发参数 下面的图中,选择了1个接口,每次迭代中1个接口同时请求,迭代1000次(…

【uniapp3】分享一个自己写的h5日历组件

简言 分享一下自己基于uniapp写的日历组件。如果不太满足你的需求,可以自己改造。 日历 实现分析: 页面显示 - 分为顶部显示和日历显示,我这里做了多行和单行显示两种情况,主要是当时看着手机的日历做的,手机上的…

Java设计模式(代理模式整理中ing)

一、代理模式 1、代理模式定义: 代理模式:由于某些原因要给某对象提供一个代理以控制对该对象的访问,这时访问对象不适合或者不能够直接引用目标对象,代理对象作为访问对象与目标对象之间的中介进行连接调控调用。 2、代理模式的…

Thumb 汇编指令集,Thumb 指令编码方式,编译 Thumb 汇编代码

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ Thumb指令集 ARM 指令集:最早在 1985 年随第一代 ARM 处理器问世。ARM 指令集一开始是 32 位固定长度的指令,用于各种计算任务。 Thu…

Leetcode - 周赛421

目录 一,3334. 数组的最大因子得分 二,3335. 字符串转换后的长度 I 三,3336. 最大公约数相等的子序列数量 四,3337. 字符串转换后的长度 II 一,3334. 数组的最大因子得分 暴力方法就不演示,这里介绍一个…

文件管理工具的按路径名称归类功能大公开,将大量文件批量复制或移动到指定路径,办公软件达人的秘密武器

是否还在为成堆的文件归类而苦恼?想要一键就能将海量文件按路径名称轻松归类,无论是复制还是移动?别急,今天就让文件批量改名高手软件的按路径名称归类功能来拯救你的文件管理世界!让我们一起告别繁琐,迎接…

建设NFS服务器并实现文件共享

关闭防火墙和s0 systemctl stop firewalld setenforce 0 安装NFS yum install nfs-utils -y 新建共享目录并设置权限 echo "hello" > /nfs/shared/test1 chmod -Rf 777 /nfs/shared/ 配置服务端的NFS配置文件 vim /etc/exports /nfs/shared *(ro) 启动…

曹操出行借助 ApsaraMQ for Kafka Serverless 提升效率,成本节省超 20%

本文整理于 2024 年云栖大会主题演讲《云消息队列 ApsaraMQ Serverless 演进》,杭州优行科技有限公司消息中间件负责人王智洋分享 ApsaraMQ for Kafka Serverless 助力曹操出行实现成本优化和效率提升的实践经验。 曹操出行:科技驱动共享出行未来 曹操…

(转载)Tools for Learning LLVM TableGen

前提 最近在学习有关llvm的东西,其中TableGen占了一部分,所以想特意学习下TableGen相关的语法。这里找到了LLVM官网的一篇介绍TableGen的博客,学习并使用机器翻译为中文。在文章的最后也添加了一些学习TableGen的资源。 原文地址&#xff1…

vue3uniapp实现自定义拱形底部导航栏,解决首次闪烁问题

前言: 我最初在网上翻阅查找了很多方法,发现大家都是说在page.json中tabbar中添加:"custom": true,即可解决首次闪烁的问题,可是添加了我这边还是会闪烁,因此我这边改变了思路,使用了虚拟页面来解…

【P2-5】ESP8266 WIFI模块在AP模式下作为TCP服务器与多个电脑/手机网络助手(TCP客户端)通信——TCP数据透传

前言:完成ESP8266 WIFI模块在AP模式下作为TCP服务器与多个电脑/手机网络助手(TCP客户端)通信——实现TCP数据透传 AP模式,通俗来说模块可以发出一个WIFI热点提供给电脑/手机连接。 TCP服务端,通俗来说就是模块/单片机作为服务器,可以接收多个客户通道的连接。 本…

Kali Linux 新工具推荐: Sploitscan

在 2024.2 版本 Kali Linux 增加了一个新攻击工具: Sploitscan 1.简介: Sploitscan 能够发现操作系统和应用程序中的安全漏洞。 2.特点: 简单的命令行界面 扫描多个操作系统和应用程序 检测多种漏洞 提供详细信息 可定制性强 3.示例: 2024.2 及以后的版本 Kali Linux…

11.Three.js使用indexeddb前端缓存模型优化前端加载效率

11.Three.js使用indexeddb前端缓存模型优化前端加载效率 1.简述 在使用Three.js做数字孪生应用场景时,我们常常需要用到大量模型或数据。在访问我们的数字孪生应用时,每次刷新都需要从web端进行请求大量的模型数据或其他渲染数据等等,会极大…

基于PyTorch的大语言模型微调指南:Torchtune完整教程与代码示例

近年来,大型语言模型(Large Language Models, LLMs)在自然语言处理(Natural Language Processing, NLP)领域取得了显著进展。这些模型通过在大规模文本数据上进行预训练,能够习得语言的基本特征和语义,从而在各种NLP任务上取得了突破性的表现。为了将预训练的LLM应用于特定领域…

探索Unity:从游戏引擎到元宇宙体验,聚焦内容创作

unity是实时3D互动内容创作和运营平台,包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助Unity将创意变成现实。提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、…

3、setup语法糖

setup 概述 setup是Vue3中一个新的配置项,值是一个函数,它是 Composition API 组件中所用到的:数据、方法、计算属性、监视......等等,均配置在setup中。 特点如下: setup函数返回的对象中的内容,可直接…

USB协议学习

文章目录 USB发展背景发展变化速度等级通讯接口 四种传输主设备 & 从设备主设备从设备 连接与检测高速设备与主机连接USB总线常见的几种状态 枚举过程特点 控制传输学习资料 USB发展背景 发展变化 USB1.1:规范了USB低全速传输; USB2.0:…

讲讲 kafka 维护消费状态跟踪的方法?

大家好,我是锋哥。今天分享关于【讲讲 kafka 维护消费状态跟踪的方法?】面试题?希望对大家有帮助; 讲讲 kafka 维护消费状态跟踪的方法? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Kafka 中&#x…

【成都新篇】龙信科技电子取证实验室,引领科技取证新时代

文章关键词:电子数据取证实验室、手机取证、介质取证、云取证、现场勘查、电子物证 在科技创新的浪潮中,龙信科技成都实验室以其卓越的电子数据取证服务,成为了中西部地区一颗璀璨的明珠。随着新址的搬迁,我们不仅扩大了业务范围…