设计模式详解-代理模式

类型:结构型模式

实现原理:创建具有现有对象的对象

作用:为其他对象提供一种代理以控制对这个对象的访问。

解决的问题:由于对象的访问条件不一,直接访问对象会造成麻烦问题

解决问题的方法:增加中间层。

何时使用:想在访问一个类时做一些控制。

实现核心:实现与被代理类组合。

应用实例:Windows 里面的快捷方式

优点:1、分工明确。 2、易扩展

缺点:有些代理模式的实现非常复杂、有些代理模式可能会造成请求的处理速度变慢

使用场景:按职责来划分,通常有以下使用场景: 1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。

注意事项:
1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。 2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

实现

步骤 1
创建一个接口。Image.java
public interface Image {void display();
}
步骤 2
创建实现接口的实体类。RealImage.java
public class RealImage implements Image {private String fileName;public RealImage(String fileName){this.fileName = fileName;loadFromDisk(fileName);}@Overridepublic void display() {System.out.println("Displaying " + fileName);}private void loadFromDisk(String fileName){System.out.println("Loading " + fileName);}
}
ProxyImage.java
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();}
}
步骤 3
当被请求时,使用 ProxyImage 来获取 RealImage 类的对象。ProxyPatternDemo.java
public class ProxyPatternDemo {public static void main(String[] args) {Image image = new ProxyImage("test_10mb.jpg");// 图像将从磁盘加载image.display(); System.out.println("");// 图像不需要从磁盘加载image.display();  }
}
步骤 4
执行程序,输出结果:Loading test_10mb.jpg
Displaying test_10mb.jpgDisplaying test_10mb.jpg这段代码展示了代理模式的实现。下面对代码进行解释:步骤1:定义了一个Image接口,其中包含了一个display()方法。步骤2:创建了两个类,RealImageProxyImage,都实现了Image接口。RealImage类负责实际加载和显示图片,它接收一个文件名作为参数,在构造函数中从磁盘加载图片,并通过display()方法来显示图片。loadFromDisk()方法用于模拟从磁盘加载图片的过程。ProxyImage类充当了RealImage的代理类,它也实现了Image接口。ProxyImage类包含了一个RealImage对象和一个文件名。在调用display()方法时,如果realImage对象为空,表示图片尚未加载,则实例化一个RealImage对象并加载图片;然后调用realImage的display()方法显示图片。步骤3:在主程序ProxyPatternDemo中,创建了一个ProxyImage对象,并传入一个测试用的图片文件名。然后通过调用image.display()来显示图片。步骤4:执行程序,输出结果。第一次调用display()方法时,由于RealImage对象为空,会先进行加载图片的操作,然后显示图片。第二次调用display()方法时,由于RealImage对象已经存在,不再需要重新加载图片,直接显示即可。这个例子说明了代理模式的用途。在图片加载的过程中,由于加载大图可能比较耗时,所以可以使用代理模式来延迟加载图片,只有在需要显示图片时才加载。这样能够提高程序的性能和响应速度。```

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生成式AI系列 —— DCGAN生成手写数字

1、模型构建 1.1 构建生成器 # 导入软件包 import torch import torch.nn as nnclass Generator(nn.Module):def __init__(self, z_dim20, image_size256):super(Generator, self).__init__()self.layer1 nn.Sequential(nn.ConvTranspose2d(z_dim, image_size * 32,kernel_s…

JVM——StringTable面试案例+垃圾回收+性能调优+直接内存

JVM——引言JVM内存结构_北岭山脚鼠鼠的博客-CSDN博客 书接上回内存结构——方法区。 这里常量池是运行时常量池。 方法区 面试题 intern()方法 intern() 方法用于在运行时将字符串添加到内部的字符串池stringtable中,并返回字符串池stringtable中的引用。 返…

228. 汇总区间

汇总区间 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围 [a,…

计算机组成与设计 Patterson Hennessy 笔记(二)MIPS 指令集

计算机的语言:汇编指令集 也就是指令集。本书主要介绍 MIPS 指令集。 汇编指令 算数运算: add a,b,c # abc sub a,b,c # ab-cMIPS 汇编的注释是 # 号。 由于MIPS中寄存器大小32位,是基本访问单位,因此也被称为一个字 word。M…

输入输出+暴力模拟入门:魔法之树、染色の树、矩阵、字母加密、玫瑰鸭

秋招实习刷题网站推荐&#xff1a;codefun2000.com&#xff0c;还有题解博客&#xff1a;blog.codefun2000.com/。以下内容都是来自塔子哥的~ 输入输出 2023.04.15-春招-第三题-魔法之树 //#include<bits/stdc.h> #include<vector> #include<iostream>usin…

Datawhale Django后端开发入门Task01 Vscode配置环境

首先呢放一张运行成功的截图纪念一下&#xff0c;感谢众多小伙伴的帮助呀&#xff0c;之前没有配置这方面的经验 &#xff0c;但还是一步一步配置成功了&#xff0c;所以在此以一个纯小白的经验分享如何配置成功。 1.选择要建立项目的文件夹&#xff0c;打开文件找到目标文件夹…

csapp archlab PartC满分解答

任务 修改ncopy.ys和pipe-full.hcl以尽可能的提高ncopy.ys的运行速度 思路 pipe-full.hcl&#xff1a; 实现iaddq指令&#xff08;家庭作业4.54&#xff09;实现加载转发&#xff08;家庭作业4.57&#xff09; ncopy.ys&#xff1a; 使用循环展开&#xff08;第5.8节&…

openai多模态大模型:clip详解及使用

引言 CLIP全称Constrastive Language-Image Pre-training&#xff0c;是OpenAI推出的采用对比学习的文本-图像预训练模型。CLIP惊艳之处在于架构非常简洁且效果好到难以置信&#xff0c;在zero-shot文本-图像检索&#xff0c;zero-shot图像分类&#xff0c;文本→图像生成任务…

windows服务器下java程序健康检测及假死崩溃后自动重启应用、开机自动启动

前两天由于项目需要&#xff0c;一个windows上的批处理任务&#xff08;kitchen.bat&#xff09;&#xff0c;需要接到mq的消息通知后执行&#xff0c;为了快速实现这里我们通过springboot写了一个jar程序&#xff0c;用于接收mq的消息&#xff0c;并调用bat文件。 本程序需要实…

缺少或找不到vcruntime140_1.dll的解决方法

某天&#xff0c;当我准备打开电脑上的一个应用程序时&#xff0c;突然收到一个错误提示&#xff0c;显示缺少了vcruntime140_1.dll文件。这个文件是一个重要的系统组件&#xff0c;它的丢失导致了我无法正常运行该应用程序。于是&#xff0c;我开始了一场寻找和修复旅程。然而…

总线超时导致的bus hang 相关问题介绍

1、前提背景&#xff1a; 在一些嵌入式机器的系统运行过程中&#xff0c;时常会发生一些bus hang的问题&#xff0c;直接导致的后果是系统卡住或者触发重启&#xff0c;最终整体系统运行异常。 2、什么是bus hang&#xff1a; 简单说&#xff0c;就是系统的某个模块已经停止…

【Python】Python文件转为可执行文件

将py文件打包成可执行文件 安装pyinstaller pip install pyinstaller打包执行文件 pyinstaller -F F:\AutomationTest\perf_tools.py --onefile 将所有依赖项合并为单个可执行文件&#xff0c;而不是多个文件打包成功后&#xff0c;当前目录生成一个dist文件夹 生成的可执行…

这是我的纪念日

我的1460天 写这篇文章&#xff0c;是为了纪念自己这一千多个日日夜夜&#xff0c;我的热爱总算有了回报。 每次看到有小伙伴点赞&#xff0c;评论的时候&#xff0c;我都很开心&#xff0c;我知道自己的选择是正确的&#xff0c;我喜欢分享自己的所见所学&#xff0c;我也很…

python3.7 安装pywin32报错,完美解决方法

本机环境 python&#xff1a;3.7 遇到2种报错 第一种 ImportError: DLL load failed: The specified module could not be found.第二种&#xff1a; import win32gui ModuleNotFoundError: No module named ‘win32gui‘解决方法 我安装pywin32时候&#xff0c;是直接pi…

什么是反射机制?为什么反射慢?

目录 面试回答 知识扩展 反射常见的使用方式 反射和 Class 的关系 面试回答 反射指的是程序在运行时能够获取自身的信息。在 java 中&#xff0c;只要给定类的名字&#xff0c;那么就可以通过反射机制来获得类的所有属性和方法。 Java 的反射可以&#xff1a; 在运行时判断…

stm32红绿灯源代码示例(附带Proteus电路图)

本代码不能直接用于红路灯&#xff0c;只是提供一个思路 #include "main.h" #include "gpio.h" void SystemClock_Config(void); void MX_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOB_CLK_ENAB…

Jenkins-CICD-python/Java包升级与回退

Jenkins- CICD流水线 python/Java代码升级与回退 1、执行思路 1.1、代码升级 jenkins上点击 upgrade和 代码版本号 --${tag} jenkins 推送 代码 和 执行脚本 到目标服务器/opt目录下 执行命令 sh run.sh 代码名称 版本号 upgrade 版本号 来自jenkins的 构建参数中的 标签…

Gitlab-第四天-CD到k8s集群的坑

一、.gitlab-ci.yml #CD到k8s集群的 stages: - deploy-test build-image-deploy-test: stage: deploy-test image: bitnami/kubectl:latest # 使用一个包含 kubectl 工具的镜像 tags: - k8s script: - ls -al - kubectl apply -f deployment.yaml # 根据实际情况替换…

LlamaGPT -基于Llama 2的自托管类chatgpt聊天机器人

LlamaGPT一个自托管、离线、类似 ChatGPT 的聊天机器人&#xff0c;由 Llama 2 提供支持。100% 私密&#xff0c;不会有任何数据离开你的设备。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 1、如何安装LlamaGPT LlamaGPT可以安装在任何x86或arm64系统上。 首先确保…