结构型-代理模式(Proxy Pattern)

概述

代理模式是一种结构型设计模式,它使得代理对象可以控制对实际对象的访问。在代理模式中,代理对象通过持有对实际对象的引用,来代替实际对象进行操作。

代理对象对客户端隐藏了实际对象的细节,并可以在调用实际对象之前或之后执行一些额外的操作,如权限验证、缓存数据、对请求进行转发等。

  • 优点:
    • 增加了中间层代理对象,使得对实际对象的访问更加安全和灵活。
    • 在代理对象中可以进行一些额外的操作,如权限验证、缓存数据等。
    • 代理模式可以隐藏实际对象的细节,对客户端透明,也可以对访问进行控制。
  • 缺点:
    • 在增加了代理对象之后,系统的复杂度会有所增加。
    • 可能会降低系统的性能,因为通过代理对象调用实际对象需要额外的开销。
  • 使用场景:
    • 延迟加载:当加载一个较大的对象时,可以通过代理对象在需要时才创建实际对象,从而提高系统的性能。
    • 访问控制:可以在代理对象中实现访问控制的逻辑,对实际对象的访问进行权限验证。
    • 缓存机制:通过代理对象在调用实际对象之前,先检查缓存中是否存在对象的副本,如果存在直接返回缓存的对象,从而减少了对实际对象的访问。

示例

假设我们有一个远程文件下载器,负责从远程服务器下载文件。为了增强下载器功能,我们可以使用代理模式来创建一个下载器的代理。

首先定义一个远程文件下载器的接口:

public interface FileDownloader {void download(String url);
}

然后实现实际的远程文件下载器:

public class FileDownloaderImpl implements FileDownloader {@Overridepublic void download(String url) {// 实际的下载逻辑,省略System.out.println("Downloading file from " + url);}
}

接下来定义一个文件下载代理:

public class FileDownloaderProxy implements FileDownloader {private FileDownloaderImpl fileDownloader;@Overridepublic void download(String url) {// 在下载文件之前进行一些额外的操作System.out.println("Before downloading file");// 延迟加载实际文件下载器if (fileDownloader == null) {fileDownloader = new FileDownloaderImpl();}// 调用实际文件下载器的方法fileDownloader.download(url);// 在下载文件之后进行一些额外的操作System.out.println("After downloading file");}
}

客户端代码可以通过文件下载代理来下载文件,而无需直接访问实际下载器:

public class Client {public static void main(String[] args) {FileDownloader downloader = new FileDownloaderProxy();downloader.download("https://example.com/file.txt");}
}

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

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

相关文章

【ARM 常见汇编指令学习 4 -- ARM64 比较指令 cbnz 与 b.ne 区别】

文章目录 B.NE 指令格式CBNZ 指令格式 上篇文章&#xff1a;ARM 常见汇编指令学习 3 – ARM64 无符号位域提取指令 UBFX 下篇文章&#xff1a;ARM 常见汇编指令学习 5 – arm64汇编指令 wzr 和 xzr B.NE 指令格式 B.NE <label>B.NE指令的含义是&#xff1a;如果上一个指…

无线温湿度信息收集点模块的组成和工作状态及编程与组网建议

在传感技术与物联网的不断发展下&#xff0c;无线温湿度信息收集点模块作为一种重要的终端设备&#xff0c;被广泛应用于各个领域。本文将详细介绍该模块的组成和工作状态&#xff0c;并给出编程和组网的建议。 一、组成 该无线温湿度信息收集点模块由以下几个核心组成部分构成…

自然语言处理从入门到应用——LangChain:模型(Models)-[文本嵌入模型Ⅰ]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 本文将介绍如何在LangChain中使用Embedding类。Embedding类是一种与嵌入交互的类。有很多嵌入提供商&#xff0c;如&#xff1a;OpenAI、Cohere、Hugging Face等&#xff0c;这个类旨在为所有这些提供一个标准接口。 …

安卓:百度地图开发(超详细)

一、百度地图介绍 百度地图SDK是一套供开发者使用的软件开发工具包&#xff08;SDK&#xff09;&#xff0c;用于在Android应用程序中集成和使用百度地图功能。通过使用百度地图SDK&#xff0c;开发者可以实现在自己的应用中显示地图、获取定位信息、进行搜索、导航等功能。 百…

算法----二叉搜索树中第K小的元素

题目 二叉搜索树中第K小的元素 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 个最小元素&#xff08;从 1 开始计数&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,null,2], k 1 输出&#xff…

docker swarm查看日志汇总

目录 从头显示所有日志并持续输出 显示末尾最后5行并持续输出 查看最近五分钟内的日志 查看指定时间之后的日志并持续输出 从头显示所有日志并持续输出 docker service logs -f xx 显示末尾最后5行并持续输出 docker service logs -f -n 5 xx或docker service logs -f…

STL中的神秘“指针”:迭代器

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;C学习 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大…

NAT协议(网络地址转换协议)详解

NAT协议&#xff08;网络地址转换协议&#xff09;详解 为什么需要NATNAT的实现方式静态NAT动态NATNAPT NAT技术的优缺点优点缺点 NAT协议是将IP数据报头中的IP地址转换为另外一个IP地址的过程&#xff0c;主要用于实现私有网络访问公有网络的功能。这种通过使用少量的IP地址代…

2023-7-26-第二十三式解释器模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

[vue] 新项目配置整理(没写完,回头有空继续)

省流版(vue2项目)&#xff1a; 脚手架&#xff1a;vue create xxxx vuex&#xff1a;npm i vuex3 router : npm install vue-router3 vue cli创建项目 vue create xxxx(项目名称) 添加基本配置 module.exports {lintOnSave: false, // 关闭eslint检查publicPath:./, //…

Longhorn vs Rook vs OpenEBS vs Portworx vs IOMesh:细说 5 款 K8s 持久化存储产品优劣势

云原生时代下&#xff0c;越来越多的企业开始使用 Kubernetes&#xff08;K8s&#xff09;承载数据库、消息中间件等“生产级”有状态工作负载。由于这些应用对数据持久保存、性能、容量扩展和快速交付具有较高的要求&#xff0c;企业往往需要采用专为 Kubernetes 环境设计的持…

【异常错误】deepspeed:Cannot specify num_nodes/gpus with include/exclude(deepspeed配置GPU id)

今天在使用deepspeed进行训练的时候&#xff0c;本来想使用GPU 4,5,6,7&#xff0c;但是设置了如下命令还是不管用&#xff1a; export CUDA_VISIBLE_DEVICES4,5,6,7 最后在deepspeed的配置文件中进行配置&#xff0c;才得以解决&#xff0c;期间遇到错误&#xff1a; [2023-0…

ViT-vision transformer

ViT-vision transformer 介绍 Transformer最早是在NLP领域提出的&#xff0c;受此启发&#xff0c;Google将其用于图像&#xff0c;并对分类流程作尽量少的修改。 起源&#xff1a;从机器翻译的角度来看&#xff0c;一个句子想要翻译好&#xff0c;必须考虑上下文的信息&…

使用easyui的tree组件实现给角色快捷分配权限功能

这篇文章主要介绍怎么实现角色权限的快捷分配功能&#xff0c;不需要像大多数项目的授权一样&#xff0c;使用类似穿梭框的组件来授权。 具体实现&#xff1a;通过菜单树的勾选和取消勾选来给角色分配权限&#xff0c;在这之前&#xff0c;需要得到角色的菜单树&#xff0c;角色…

笔记整理-SpringBoot中的扩展点

SpringBoot有哪些扩展点 aware 感知类接口 aware系列的扩展接口&#xff0c;允许spring应用感知/获取特定的上下文环境或对象。bean生命周期控制类接口 bean生命周期类的接口&#xff0c;可以控制spring容器对bean的处理。app生命周期控制类接口 app生命周期控制类接口&#xf…

【Lua学习笔记】Lua进阶——Table,迭代器

文章目录 官方唯一指定数据结构--tabletable的一万种用法字典和数组 迭代器ipairs()pairs() 回到Table 在【Lua学习笔记】Lua入门中我们讲到了Lua的一些入门知识点&#xff0c;本文将补充Lua的一些进阶知识 官方唯一指定数据结构–table 在上篇文章的最后&#xff0c;我们指出…

第九十四回 如何打造一个网络框架

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了"如何mock数据"相关的内容&#xff0c;本章回中将介绍如 何打造一个网络框架闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 最近在项目中使用dio处理网络相关的内容&#xff0c;有些地方的代…

Mybatis使用collection映射一对多查询分页问题

场景&#xff1a;页面展示列表&#xff0c;需要查询多的字段&#xff0c;和一的字段。并且还要分页。 这时候直接想到的是手写sql。 /*** 标签*/private List<BasicResidentTags> tags;Data TableName("basic_resident_tags") public class BasicResidentTag…

SpringCloud微服务实战——搭建企业级开发框架(五十三):微信小程序授权登录增加多租户可配置界面

GitEgg框架集成weixin-java-miniapp工具包以实现微信小程序相关接口调用功能&#xff0c;weixin-java-miniapp底层支持多租户扩展。每个小程序都有唯一的appid&#xff0c;weixin-java-miniapp的多租户实现并不是以租户标识TenantId来区分的&#xff0c;而是在接口调用时&#…

C#如何使用SQLite数据库?

文章目录 0.引言1.SQLite工具准备2.创建窗体项目并添加SQLite的命名空间3.编写使用SQLite代码4.结果展示 0.引言 SQLite是一个轻量级的嵌入式数据库&#xff0c;它的库文件非常小巧&#xff0c;不需要独立的服务器进程或配置。这使得它非常适合在资源受限的环境中使用&#xff…