设计模式学习之代理模式

news2024/12/24 2:21:33

设计模式系列往期文章

  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 {
    @Override
    public List<Video> listVidos() {
        // TOOD
    }
	
	@Override
    public Video downloadVideo(String videoId) {
        // TODO
    }
    
	@Override
    public 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();
    }

    @Override
    public 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;
    }

	@Override
    public List<Video> listVidos() {
        // TOOD
    }
	
	@Override
    public Video downloadVideo(String videoId) {
        // TODO
    }

    public void reset() {
        cache.clear();
    }
}

UML图

在这里插入图片描述

对应的plantUML代码:

@startuml

skinparam linetype ortho

package "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 note

  note right of ProxySubject
    // 在代理类中保存了一个被代理类的实例
  end note

  Subject <|.. RealSubject
  Subject <|.. ProxySubject
  RealSubject <-- ProxySubject

  Client ..> Subject

}
@enduml

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

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

相关文章

怎么把录音转文字?录音转文字怎么操作

以前在采访过程中&#xff0c;总是需要及时记录采访者的回答&#xff0c;并把这些回答准确地记录到笔记本上。然而手写记录不仅效率低下&#xff0c;还可能因为笔迹潦草而导致记录错误。 后来在前辈的指导下&#xff0c;我才知道可以使用录音转文字工具来解决这些问题&#xf…

[安洵杯 2019]game

前言 llvm混淆&#xff0c;第一次接触到&#xff0c;没找到可以直接反混淆的工具&#xff0c;但看了相关知识后&#xff0c;发现有效代码依旧是原有的那一小部分&#xff0c;所以可以直接看有意义的部分代码&#xff0c;有时间好好了解下吧 代码分析 v8是我们输入的&#xff…

设计模式篇(Java):适配器模式

设计模式篇(Java)&#xff1a;建造者模式 八、适配器模式 8.1 适配器模式基本介绍 生活中的适配器例子 比如生活中的插座&#xff0c;在不同国家插座有着不同的规格&#xff0c;如果我们从一个国家去另外一个国家需要使用插座时就需要一个中间转换器把两种不同规则的插座适配一…

【数据结构导论】第 3 章:栈、队列和数组

目录 一、栈 &#xff08;1&#xff09;栈的基本概念 ① 定义 ② 示意图 ③ 栈的特点 ④ 栈的基本运算 &#xff08;2&#xff09;栈的顺序实现 ① 顺序栈及常用名词 ② 顺序栈的类型定义 ③ 顺序栈的基本运算 Ⅰ. 初始化 Ⅱ. 判栈空 Ⅲ. 进栈 Ⅳ. 出栈 Ⅴ. …

【JavaSE】程序逻辑控制

目录 【1】概念 【2】顺序结构 【3】分支结构 【3.1】if 语句 【3.2】switch 语句 【4】循环结构 【4.1】while 循环 【4.2】for 循环 【4.3】do while 循环 【4.4】break 关键字 【4.5】continue 关键字 【5】输入输出 【5.1】输出到控制台 【5.2】从键盘输入 …

第38节:cesium 风场效果(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><vc-viewer @ready="ready" :logo="false"><!

抖音seo矩阵系统源码开发部署|抖音小程序接入(一)

一、 开发部署步骤&#xff1a; &#xff08;1&#xff09;申请开放平台服务商 &#xff08;2&#xff09;申请开放平台网站应用 &#xff08;3&#xff09;申请开放平台应用权限 &#xff08;4&#xff09;提交各个API接口申请文档 &#xff08;5&#xff09;审核通过技…

JVM实战-2023线上项目突发OOM以及快速定位解决全过程

现象描述&#xff1a; 用户在进行报表下载过程中&#xff0c;每隔几天系统就会报错500&#xff0c;导致无法进行报表下载。 原因分析: 通过查看系统log日志以及gc日志&#xff0c;发现是因为下载报表过程中JVM频繁进行Full GC&#xff0c;而且老年代的堆内存不断增加且无法回…

chatgpt赋能python:Python彻底删除指南:为什么需要彻底删除Python?

Python彻底删除指南&#xff1a;为什么需要彻底删除Python&#xff1f; Python是一种高级编程语言&#xff0c;它广泛用于各种应用程序的开发。但是&#xff0c;对于某些开发者来说&#xff0c;可能需要从他们的计算机中彻底删除Python。这可能是因为他们需要将Python版本更新…

Linux--打印内容或者插入内容:echo

语法&#xff1a; echo 内容 作用&#xff1a;打印内容到显示器echo 内容 > 不存在的文件 作用&#xff1a;文件创建&#xff0c;并将内容插入新创建的文件中echo 内容 > 存在的文件 作用&#xff1a;覆盖文件原有的内容 echo 内容 >> 存在的文件 作用&#xff1a…

Redis的持久化机制(2)

AOF 以独立日志的方式记录每次写命令&#xff08;读操作不记录&#xff09;&#xff0c;重启时再重新执行AOF文件中的命令来恢复数据。AOF会先把命令追加在AOF缓冲区&#xff0c;然后根据对应策略写入硬盘&#xff08;appendfsync&#xff09;&#xff0c;它只许追加文件但不可…

【vue:淘宝rem自适应 】

vue:淘宝rem自适应 1.安装lib-flexible&#xff1a;cnpm install lib-flexible --save 2.在main.js中引入&#xff1a;import lib-flexible/flexible.js’ 3.配置flexible找到vue-cli路径node_modules/lib-flexible/flexible.js&#xff0c;然后修改rem换算单位 4.配置px to re…

ThreadLocal-线程安全利器

原文链接&#xff1a;https://www.jylt.cc/#/detail?activityIndex2&id9df3fd62d6ee13ff555c30157798b092 ThreadLocal是什么 ThreadLocal用来提供线程内部的局部变量&#xff0c;是各个线程独有的&#xff0c;该变量无法被其他线程访问。主要有以下作用&#xff1a; 解…

pyqt5实现线程与弹窗功能

pyqt5实现线程与弹窗功能 效果图&#xff1a; 示例下载 点我下载 https://download.csdn.net/download/lm_is_dc/87982279 简介 Pyqt5线程使用 QThread, pyqtSignal, QMutex, QWaitCondition来实现&#xff0c;涉及到线程&#xff0c;锁&#xff0c;信号量&#xff0c;线程…

深入理解计算机系统(2)_计算机基本组成

深入理解计算机系统系列文章目录 第一章 计算机的基本组成 1. 内容概述 2. 计算机基本组成 第二章 计算机的指令和运算 第三章 处理器设计 第四章 存储器和IO系统 文章目录 深入理解计算机系统系列文章目录前言参考资料一、组成架构&#xff08;冯/图&#xff09;1. 组成架构2…

42. 接雨水

题目链接&#xff1a;力扣 解题思路&#xff1a;从左往右按列进行计算&#xff0c;依次计算每一列能够接到的雨水数量。对于当前列能够接到的雨水数量是由左右两边最高的两根柱子决定的&#xff0c;类似于木桶定律&#xff08;一只水桶能装多少水取决于它最短的那块木板&#x…

AI实践-定制你的专属简历-软件测试

简历对于找到一份理想的工作至关重要。但是&#xff0c;准备简历这一过程却让人感到头疼和繁琐&#xff0c;而且如何突出自己的优势&#xff0c;也是许多求职者遇到困惑。 chatgpt不会受到情感和个人喜好的影响&#xff0c;能够通过算法和数据分析为您编写最合适的简历。并且可…

目标检测算法-YOLOV5解析(附论文与源码)

目标检测算法-YOLOV5解析&#xff08;附论文与源码&#xff09;

数据结构 | 顺序二叉树

一、数据结构定义 1、顺序二叉树 /* 顺序二叉树 */ typedef char TreeType; typedef struct seqTree{int MAXNUM; // 最大元素个数int curNum; // 元素的个数TreeType nodelist[]; // 顺序二叉树节点存储 } *SeqTree; 本次代码中二叉树的结构如下图&#xff0c;用层次序列可…

【Python】字典

文章目录 一. 字典的创建二. 字典的操作1. 查找 key2. 新增键值对3. 删除键值对4. 遍历字典4.1 使用 for 循环遍历字典4.2 通过方法遍历字典keys() 获取到字典中所有 keyvalues() 获取到字典中的所以 valueitems 获取到字典中的所有键值对 三. 理解字典操作的效率 一. 字典的创…