设计模式学习之代理模式

设计模式系列往期文章

  1. 设计模式学习之策略模式
  2. 设计模式学习之策略模式在前端的应用
  3. 设计模式学习之简单工厂模式
  4. 设计模式学习之工厂方法模式
  5. 设计模式学习之抽象工厂模式
  6. 设计模式学习之策略模式和简单工厂模式的对比
  7. 设计模式学习之观察者模式
  8. 设计模式学习之模板方法模式

代理模式是结构型设计模式的一种,如下图所示——这种设计模式通过提供一个代理供调用方使用,代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。
请添加图片描述

应用场景

当无法或不想直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口

举个栗子

某程序库提供了视频下载类。 但是该类的效率非常低。 如果客户端程序多次请求同一视频, 程序库会反复下载该视频, 而不会将首次下载的文件缓存下来复用。

这个时候就可以添加一个代理类(这个代理类实现和原视频下载类相同的接口),该代理类将所有工作委派给原下载器。不过代理类也不是什么都不做,代理类能够保存所有的文件下载记录, 如果程序多次请求同一文件, 它会返回缓存的文件,这样便可以完成优化。

说明:因此代理类相当于在被代理类的基础上做了一层封装,可以额外添加一些属性或者方法。

对应的类图为:

实现伪代码如下:

/** 三方视频下载接口 */
public interface ThirdPartyTVLib {List<Video> listVidos();Video getVideoInfo(String videoId);Video downloadVideo(String videoId);
}/** 三方视频下载类 */
public class ThirdPartyTVClass implements ThirdPartyTVLib {@Overridepublic List<Video> listVidos() {// TOOD}@Overridepublic Video downloadVideo(String videoId) {// TODO}@Overridepublic Video getVideoInfo(String videoId) {connectToServer("http://www.youtube.com/" + videoId);return getSomeVideo(videoId);}private int random(int min, int max) {return min + (int) (Math.random() * ((max - min) + 1));}private void connectToServer(String server) {System.out.print("Connecting to " + server + "... ");experienceNetworkLatency();System.out.print("Connected!" + "\n");}private Video getSomeVideo(String videoId) {System.out.print("Downloading video... ");Video video = new Video(videoId, "Some video title");System.out.print("Done!" + "\n");return video;}
}/** 代理类 */
public class CachedTVClass implements ThirdPartyTVLib {private HashMap<String, Video> cache = new HashMap<String, Video>();private ThirdPartyTVLib thirdPartyTVLib;public CachedTVClass() {this.thirdPartyTVLib = new ThirdPartyTVClass();}@Overridepublic Video getVideoInfo(String videoId) {Video video = cache.get(videoId);if (video == null) {video = thirdPartyTVLib.getVideo(videoId);cacheAll.put(videoId, video);} else {System.out.println("Retrieved video '" + videoId + "' from cache.");}return video;}@Overridepublic List<Video> listVidos() {// TOOD}@Overridepublic Video downloadVideo(String videoId) {// TODO}public void reset() {cache.clear();}
}

UML图

在这里插入图片描述

对应的plantUML代码:

@startumlskinparam linetype orthopackage "Proxy" <<Frame>> {interface Subject {+ method()}class RealSubject {+ method()}class ProxySubject {- subject: RealSubject+ method()+ otherMethod()}class Client {}note right of Client// Client直接调用代理类subject = new ProxySubject();subject.method();end notenote right of ProxySubject// 在代理类中保存了一个被代理类的实例end noteSubject <|.. RealSubjectSubject <|.. ProxySubjectRealSubject <-- ProxySubjectClient ..> Subject}
@enduml

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

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

相关文章

Nginx-反向代理详解

本文已收录于专栏 《中间件合集》 目录 概念说明什么是Nginx什么是反向代理 功能介绍配置过程1.修改nginx配置文件修改全局模块修改工作模块修改HTTP模块 2.保存配置文件3.重启配置文件4.查看配置文件是否重启成功 配置反向代理的好处总结提升 概念说明 什么是Nginx Nginx 是一…

《企业性能测试:体系构建、落地指导与案例解读》——小解送书第四期

目录 介绍 抽奖 介绍 软件系统性能的重要性无须多言&#xff0c;没有哪个用户可以忍受一个响应缓慢的网站或者反应迟钝的软件。软件性能是用户体验的核心。大部分用户可能对软件性能并不了解&#xff0c;但他们永远想使用响应更迅速的软件。所以&#xff0c;性能是评估一个软…

R语言多元数据统计分析在生态环境中的实践应用

生态环境领域研究中常常面对众多的不同类型的数据或变量&#xff0c;当要同时分析多个因变量&#xff08;y&#xff09;时需要用到多元统计分析&#xff08;multivariate statistical analysis&#xff09;。多元统计分析内容丰富&#xff0c;应用广泛&#xff0c;是非常重要和…

SQL开源替代品,诞生了

发明 SQL 的初衷之一显然是为了降低人们实施数据查询计算的难度。SQL 中用了不少类英语的词汇和语法&#xff0c;这是希望非技术人员也能掌握。确实&#xff0c;简单的 SQL 可以当作英语阅读&#xff0c;即使没有程序设计经验的人也能运用。 然而&#xff0c;面对稍稍复杂的查…

【架构治理工具】在代码存储库中记录软件架构

Markdown 是一种标准的简单语法&#xff0c;用于创建具有专业外观的文档。它比 HTML 更简单&#xff0c;无需专门的编写编辑器即可进行管理。Git配置管理工具也支持markdown格式。在 Git 环境中&#xff0c;markdown 一般用于项目的简单介绍和构建说明。&#xff08;自述文件&a…

Vue 项目中使用WebSocket 消息推送

一、功能需求 1.这是我在后台管理项目中使用到的&#xff0c;主要的作用是搞一个消息提醒的功能。 2.主要有右上角的提示和有下角的消息弹框。 3.主要实现的功能是如果用户有未读的消息&#xff0c;那么首次登录就弹框&#xff0c;如果用户关闭了页面&#xff0c;那么再次刷新…

valgrind检测内存泄漏、越界访问、野指针访问实验

前言 本次测试包括&#xff0c;检测无误的代码&#xff0c;检测内存泄漏&#xff0c;检测访问越界&#xff0c;检测野指针&#xff0c;检测访问已经释放(已经被free)的内存。 一 安装valgrind sudo apt install valgrind 二 无错误 #include <stdio.h> #include <…

GitHub+PicGo制作个人图床

目录 一、前言 二、新建Github仓库 ​编辑 三、生成token 四、配置PicGo 五、上传图片 六、新版的PicGo出了很多新功能大家可以探索一下。​编辑 一、前言 PicGo是一个用于快速上传图片并获取图片 URL 链接的工具:Releases Molunerfinn/PicGo GitHub GitHub是一个在…

pytorch动态调整学习率torch.optim.lr_scheduler import MultiStepLR

from torch.optim.lr_scheduler import MultiStepLR 简单来说&#xff0c;就是分阶段调整学习率&#xff0e; 用法&#xff1a; model ANet(classes5) #加载模型 optimizer optim.SGD(params model.parameters(), lr0.05) #优化方法使用SGD#在指定的epoch值&#x…

“因构建 而可见”,亚马逊云科技中国峰会助力企业数字化转型升级

过去十年&#xff0c;数字化转型的浪潮携带着机遇和挑战席卷而来&#xff0c;几乎每个企业都在做数字化转型&#xff0c;开始向大数据、人工智能等新技术寻求生产力的突破。但随着数字化转型深入&#xff0c;很多企业开始感受到数字化投入的成本压力&#xff0c;加之新技术正带…

使用npm install -g @vue/cli 命令安装最新的脚手架与Vue版本不匹配的问题

使用npm install -g vue/cli 命令安装最新的脚手架 创建项目时不要选择Vue版本&#xff0c;让它默认选择&#xff08;默认选择 Vue2&#xff09;否则会出现 vue版本和脚手架版本vue-cli 不兼容的问题&#xff08;怪哉&#xff09; 脚手架兼容vue2 不兼容vue3 &#xff1f; 不理…

DAY34——贪心part3

1. class Solution {public int largestSumAfterKNegations(int[] nums, int K) {// 将数组按照绝对值大小从大到小排序&#xff0c;注意要按照绝对值的大小nums IntStream.of(nums).boxed().sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1)).mapToInt(Integer::intValue)…