当前位置: 首页 > news >正文

小谈设计模式(8)—代理模式

小谈设计模式(8)—代理模式

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 代理模式
    • 代理模式角色分析
      • 抽象主题(Subject)
      • 真实主题(Real Subject)
      • 代理(Proxy)
    • 应用场景
      • 远程代理
      • 虚拟代理
      • 安全代理
      • 智能引用代理
      • 总结
    • Java程序实现
      • 首先,我们定义一个接口 Image,表示图像对象的接口:
      • 其次,我们创建一个真实的图像类 RealImage,实现 Image 接口,表示真实的图像对象:
      • 然后,我们创建一个代理类 ProxyImage,实现 Image 接口,表示图像的代理对象:
      • 最后,我们可以使用代理对象来访问真实的图像对象,例如:
      • 输出结果
      • 程序分析
    • 优缺点分析
      • 优点
      • 缺点
      • 总结

专栏介绍

专栏地址

link

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
在这里插入图片描述

代理模式

代理模式是一种结构型设计模式,它允许通过创建一个代理对象来控制对其它对象的访问。代理对象充当了被代理对象的接口,客户端通过代理对象来访问被代理对象,从而实现了对被代理对象的间接访问。

代理模式角色分析

抽象主题(Subject)

定义了代理对象和被代理对象的共同接口,客户端通过抽象主题来访问被代理对象。

真实主题(Real Subject)

实现了抽象主题接口,是被代理对象,代理对象将对其进行间接访问。

代理(Proxy)

实现了抽象主题接口,同时包含一个对真实主题的引用,客户端通过代理对象来访问真实主题。
在这里插入图片描述

应用场景

远程代理

代理模式常用于网络通信中,例如远程方法调用(RPC)。在分布式系统中,客户端可以通过代理对象来调用远程服务器上的方法,代理对象负责将调用请求发送到远程服务器并返回结果。远程代理隐藏了底层网络通信的细节,使得客户端可以像调用本地方法一样调用远程方法。

虚拟代理

虚拟代理用于在访问对象时进行一些额外的处理。一个常见的例子是延迟加载(Lazy Loading),当一个对象的创建或加载非常耗费资源时,可以使用虚拟代理来推迟对象的创建或加载,直到真正需要访问对象时才进行。例如,在图像加载时,可以使用虚拟代理来延迟加载图像数据,只有当需要显示图像时才真正加载图像数据。

安全代理

安全代理用于控制对对象的访问权限。例如,在一个权限管理系统中,可以使用安全代理来限制只有特定角色的用户才能访问某个对象。代理对象可以在访问真实对象前检查用户的角色,如果用户具有访问权限,则允许访问真实对象,否则拒绝访问。

在这里插入图片描述

智能引用代理

智能引用代理用于在访问对象时添加一些额外的功能。一个常见的例子是缓存功能,代理对象可以在访问真实对象前先检查缓存中是否存在对应的结果,如果存在则直接返回缓存结果,避免重复计算。另外,还可以使用智能引用代理来实现对象池,代理对象可以管理对象的创建和销毁,并在访问对象时从对象池中获取对象。

总结

代理模式在许多实际应用中都有广泛的应用。通过引入代理对象,可以实现对被代理对象的间接访问,并可以在访问前后做一些额外的处理,如网络通信、延迟加载、权限控制和功能扩展等。代理模式可以提高系统的灵活性和可扩展性,同时也需要权衡系统的复杂性和性能。
在这里插入图片描述

Java程序实现

首先,我们定义一个接口 Image,表示图像对象的接口:

public interface Image {void display();
}

其次,我们创建一个真实的图像类 RealImage,实现 Image 接口,表示真实的图像对象:

public class RealImage implements Image {private String filename;public RealImage(String filename) {this.filename = filename;loadFromDisk();}private void loadFromDisk() {System.out.println("Loading image from disk: " + filename);}public void display() {System.out.println("Displaying image: " + filename);}
}

然后,我们创建一个代理类 ProxyImage,实现 Image 接口,表示图像的代理对象:

public class ProxyImage implements Image {private String filename;private RealImage realImage;public ProxyImage(String filename) {this.filename = filename;}public void display() {if (realImage == null) {realImage = new RealImage(filename);}realImage.display();}
}

最后,我们可以使用代理对象来访问真实的图像对象,例如:

public class Main {public static void main(String[] args) {Image image = new ProxyImage("test.jpg");// 第一次访问,会创建真实的图像对象并显示image.display();// 第二次访问,直接显示之前创建的真实图像对象image.display();}
}

输出结果

Loading image from disk: test.jpg
Displaying image: test.jpg
Displaying image: test.jpg

程序分析

在上面的示例中,ProxyImage 类充当了代理对象,它在访问真实的图像对象之前先进行了一些额外的处理。当第一次访问图像时,代理对象会创建真实的图像对象并显示;当第二次访问图像时,代理对象直接显示之前创建的真实图像对象,避免了重复加载和显示。通过代理对象,我们可以实现对真实对象的间接访问,并在访问前后做一些额外的处理。
在这里插入图片描述

优缺点分析

优点

代理模式可以实现对真实对象的间接访问,可以在访问前后做一些额外的处理,如权限控制、延迟加载、缓存等。
代理对象可以隐藏真实对象的具体实现细节,保护真实对象的安全性。
代理模式可以提高系统的灵活性和可扩展性,可以在不修改真实对象的情况下增加新的代理对象。
代理模式符合单一职责原则,可以将真实对象和代理对象分离,分别负责各自的功能。

缺点

由于引入了代理对象,会增加系统的复杂性,增加了代码的数量和维护的难度。
代理模式会引入额外的开销,因为需要通过代理对象来访问真实对象,可能会导致性能下降。
如果代理对象的创建和销毁过程比较复杂,可能会影响系统的性能。
在这里插入图片描述

总结

代理模式在许多实际应用中都有广泛的应用,可以提供额外的功能和保护真实对象的安全性。但是,在使用代理模式时需要权衡系统的复杂性和性能,确保代理对象的创建和销毁过程不会影响系统的性能。

相关文章:

小谈设计模式(8)—代理模式

小谈设计模式(8)—代理模式 专栏介绍专栏地址专栏介绍 代理模式代理模式角色分析抽象主题(Subject)真实主题(Real Subject)代理(Proxy) 应用场景远程代理虚拟代理安全代理智能引用代…...

queryWrapper的使用教程

大于、等于、小于 eq 等于 例&#xff1a;queryWrapper.eq("属性","lkm") ——> 属性 lkm ne 不等于 例&#xff1a;queryWrapper.ne("属性","lkm") ——> 属性<> lkm gt 大于 例&#xff1a;queryWrapper.gt("属性…...

数组模拟双链表

文章目录 QuestionIdeasCode Question 实现一个双链表&#xff0c;双链表初始为空&#xff0c;支持 5 种操作&#xff1a; 在最左侧插入一个数&#xff1b; 在最右侧插入一个数&#xff1b; 将第 k 个插入的数删除&#xff1b; 在第 k 个插入的数左侧插入一个数&#xff1b; …...

鸡群优化(CSO)算法(含MATLAB代码)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…...

3. 安装lombok maven镜像设置

安装lombok & maven镜像设置 一、maven镜像设置 Maven:负责进行项目管理、依赖工具管理的 软件。 快捷解决方案&#xff1a; 1.方法一 直接配置系统默认的文件 各个人因为登录的用户名不同&#xff0c;所以目录名不同。 2.方法二 自定义本地仓库的位置 完成之后重新打…...

详谈Spring

作者&#xff1a;爱塔居 专栏&#xff1a;JavaEE 目录 一、Spring是什么&#xff1f; 1.1 Spring框架的一些核心特点&#xff1a; 二、IoC&#xff08;控制反转&#xff09;是什么&#xff1f; 2.1 实现手段 2.2 依赖注入&#xff08;DI&#xff09;的实现原理 2.3 优点 三、AO…...

PyTorch入门之【AlexNet】

参考文献&#xff1a;https://www.bilibili.com/video/BV1DP411C7Bw/?spm_id_from333.999.0.0&vd_source98d31d5c9db8c0021988f2c2c25a9620 AlexNet 是一个经典的卷积神经网络模型&#xff0c;用于图像分类任务。 目录 大纲dataloadermodeltraintest 大纲 各个文件的作用&…...

(六)正点原子STM32MP135移植——内核移植

目录 一、概述 二、编译官方代码 三、移植 四、编译 一、概述 前面已经移植好了TF-A、optee、u-boot&#xff0c;在u-boot能正常跑起来的情况下&#xff0c;现在来移植内核。 二、编译官方代码 进入kernel目录 2.1 解压源码、打补丁 /* 解压源码 */ tar xf linux-6.1.28.…...

自媒体工作内容管理助手

内容助手 访问地址&#xff1a;editor.yunwow.cn 背景介绍 最近在学习流量运营&#xff0c; 流量运营的第一站是内容创作&#xff0c; 我试过不少原创内容&#xff0c;都是跟生活相关的例如&#xff1a;录一段联琴的视频、录一段秋天的风景、写一段生活感悟、发一段小宠物的生…...

Echarts 教程一

Echarts 教程一 可视化大屏幕适配方案可视化大屏幕布局方案Echart 图表通用配置部分解决方案1. titile2. tooltip3. xAxis / yAxis 常用配置4. legend5. grid6. series7.color Echarts API 使用全局echarts对象echarts实例对象 可视化大屏幕适配方案 rem flexible.js 关于flex…...

【Kubernetes】Kubernetes 对象是什么?

什么是 Kubernetes 对象&#xff1f;常见的 Kubernetes 对象参考&#x1f50e;感谢 &#x1f496; 什么是 Kubernetes 对象&#xff1f; Kubernetes 对象是持久化的实体&#xff0c;用于描述整个集群的状态和配置。它们是在 etcd 等持久化存储中存储的&#xff0c;因此它们的状…...

【C++设计模式之模板模式】分析及示例

C之模板模式 描述实现原理示例步骤1步骤1 分析步骤2步骤2 分析调用输出结果 结论 描述 模板模式&#xff08;Template Pattern&#xff09;是设计模式中的一种行为型模式。 该模式定义一个操作中的算法骨架&#xff0c;而将具体的算法实现延迟到子类中。 模板模式使得子类可以…...

C#捕捉全局异常

1.运行图片 2.源码 using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms;namespace 捕捉全局异常 {internal static class Program{/// <summary>/// 应用程序的主入口点。/// </summary…...

java.text.ParseException: Unparseable date: “2023-09-06T09:08:18“

问题描述&#xff1a; java.text.ParseException: Unparseable date: “2023-09-06T09:08:18” 这是在String类型转Date类型出现的错误,主要是String类型时间中间有一个T在转换的过程出现问题. 解决方法&#xff1a; SimpleDateFormat simpleDateFormat new SimpleDateFormat…...

macOS 下如何优雅的使用 Burp Suite 汉化

转载 https://www.sqlsec.com/2019/11/macbp.html 主要内容是根据上面的来的 下面总结个人出现错误的地方 主要是优雅配置方面 不要直接复制粘贴 看清楚人家的内容 下面的可以直接复制粘贴 --add-opensjava.desktop/javax.swingALL-UNNAMED --add-opensjava.base/java.lang…...

进程同步与进程互斥

1.进程同步 知识点回顾: 进程具有异步性的特征。 异步性是指&#xff0c;各并发执行的进程以各自独立的、不可预知的速度向前推进。 如何解决这种异步问题&#xff0c;就是“进程同步”所讨论的内容。 同步亦称直接制约关系&#xff0c;它是指为完成某种任务而建立的两个或多…...

公司安防工程简要介绍及系统需求分析

多年来 从事安保监控领域的经验&#xff0c;在系统的功能要求、设备选型、施 工控制、 后期维护、人员配备等各方面反复论证&#xff0c;最终形成了本方案。在系统 的硬件选择上&#xff0c;把系统的稳定性、安全性、可靠性放在第一位。根据 招标文件的要求选用当今安防行业具…...

JMETER自适应高分辨率的显示器

系列文章目录 历史文章 每天15分钟JMeter入门篇&#xff08;一&#xff09;&#xff1a;Hello JMeter 每天15分钟JMeter入门篇&#xff08;二&#xff09;&#xff1a;使用JMeter实现并发测试 每天15分钟JMeter入门篇&#xff08;三&#xff09;&#xff1a;认识JMeter的逻辑控…...

Linux工具(三)

继Linux工具&#xff08;一&#xff09;和Linux工具&#xff08;二&#xff09;&#xff0c;下面我们就来讲解Linux最后的两个工具&#xff0c;分别是代码托管的版本控制器git和代码调试器gdb。 目录 1.git-版本控制器 从0到1的实现git代码托管 检测并安装git 新建git仓库…...

基于SSM+Vue的鲜花销售系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

矢量图形编辑软件illustrator 2023 mac特点介绍

illustrator 2023 mac是一款矢量图形编辑软件&#xff0c;用于创建和编辑排版、图标、标志、插图和其他类型的矢量图形。 illustrator mac软件特点 矢量图形&#xff1a;illustrator创建的图形是矢量图形&#xff0c;可以无限放大而不失真&#xff0c;这与像素图形编辑软件&am…...

【计算机网络面试题(62道)】

文章目录 计算机网络面试题&#xff08;62道&#xff09;基础1.**说下计算机网络体系结构2.说一下每一层对应的网络协议有哪些&#xff1f;3.那么数据在各层之间是怎么传输的呢&#xff1f; 网络综合4.**从浏览器地址栏输入 url 到显示主页的过程&#xff1f;5.说说 DNS 的解析…...

JVM-满老师

JVM 前言程序计数器&#xff0c;栈&#xff0c;虚拟机栈&#xff1a;本地方法栈&#xff1a;堆&#xff0c;方法区&#xff1a;堆内存溢出方法区运行时常量池 垃圾回收垃圾回收算法分代回收 前言 JVM 可以理解的代码就叫做字节码&#xff08;即扩展名为 .class 的文件&#xff…...

加锁常见的问题

锁其是用来控制在某些场景下让代码串行的工具。我们为了充分利用计算机的硬件性能&#xff0c;发明了多线程&#xff0c;多线程有好处&#xff0c;但同时也有它复杂的一面&#xff0c;必须控制好多个线程的执行&#xff0c;才能驯服这个有能力也有脾气的烈马。 一、加锁范围误区…...

【LeetCode力扣】LCR170 使用归并排序的思想解决逆序对问题(详细图解)

目录 1、题目介绍 2、解题思路 2.1、暴力破解法 2.2、归并排序思想 2.2.1、画图详细讲解 2.2.2、归并排序解决逆序对的代码实现 1、题目介绍 首先阅读题目可以得出要点&#xff0c;即当前数大于后数时则当作一个【逆序对】&#xff0c;而题目是要求在一个数组中计算一共存…...

python经典百题之一个素数能被几个9整除

题目:判断一个素数能被几个9整除。 首先&#xff0c;我们需要明确素数的定义&#xff1a;素数是大于1&#xff0c;且只能被1和自身整除的整数。 下面将分别介绍三种实现方法&#xff0c;每种方法附上解题思路、实现代码、以及优缺点。最后&#xff0c;将对这三种方法进行总结…...

Thymeleaf 内联语法使用教程

1 表达式内联 Thymeleaf标准方言允许使用标签属性(th:)来实现很多的功能&#xff0c;但在有些场景之下&#xff0c;需要将表达式直接写入HTML 代码中和CSS代码中及JavaScript代码中【代码和html文件在一起&#xff0c;分能不开&#xff0c;待验证&#xff0c;有验证的朋友可…...

Django学习笔记-实现聊天系统

笔记内容转载自 AcWing 的 Django 框架课讲义&#xff0c;课程链接&#xff1a;AcWing Django 框架课。 CONTENTS 1. 实现聊天系统前端界面2. 实现后端同步函数 1. 实现聊天系统前端界面 聊天系统整体可以分为两部分&#xff1a;输入框与历史记录。 我们需要先修改一下之前代…...

C++转换函数

什么是转换函数? C转换函数是一种特殊的成员函数&#xff0c;用于将一个类的对象转换为另一个类型。它是通过在类中定义特定的函数来实现的。 转换函数的用途&#xff1a; 类型转换&#xff1a;转换函数可以将一个类的对象从一种类型转换为另一种类型。这样可以方便地在不同…...

Spring Boot中的@Controller使用教程

一 Controller使用方法&#xff0c;如下所示&#xff1a; Controller是SpringBoot里最基本的组件&#xff0c;他的作用是把用户提交来的请求通过对URL的匹配&#xff0c;分配个不同的接收器&#xff0c;再进行处理&#xff0c;然后向用户返回结果。下面通过本文给大家介绍Spr…...

网站开发辛苦吗/域名官网

ldap复制 1.使用yum命令安装openldap,openldap-servers,openldap-clients $ yum install openldap $ yum install openldap-servers $ yum install openldap-clients 2.安装完后&#xff0c;拷贝/usr/share/openldap-servers/slapd.conf.obsolete到/etc/openldap/slapd.conf $c…...

青岛南丰网站建设公司/开封网站快速排名优化

数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[ "((()))", "(()())", "(())()", …...

wordpress 移动端检查/陕西新站seo

代理服务器squid简介 Squid cache&#xff08;简称为Squid&#xff09;是一个流行的自由软件&#xff08;GNU通用公共许可证&#xff09;的代理服务器和Web缓存服务器。Squid有广泛的用途&#xff0c;从作为网页服务器的前置cache服务器缓存相关请求来提高Web服务器的速度&…...

小说网站收录了怎么做排名/济南优化网络营销

此脚本可列出一定时间的流量及平均流量。时间可自己设置。#!/usr/bin/env pythonimport time,sysdef all_flow(INTERFACE):f open(/proc/net/dev)flow_infof.readlines()in_flow[]out_flow[]for eth_dev in flow_info:if INTERFACE in eth_dev:in_flow.append(int(eth_dev.spl…...

网站建设费用明细/中文域名的网站

在用sphinx通過文章標題匹配相關文章時&#xff0c;去除停用詞後調出的文章相關性更好。 <?php header("Content-type:text/html;charsetutf-8"); $str file_get_contents(stop.txt);//將常見中文停用詞表內容讀入到一個字串中 $badword explode("\r\n&q…...

手机网站js特效/口碑营销案例有哪些

今天要给repeater做上一个checkbox,然后能做到圈选反选&#xff0c;本来很简单的事&#xff0c;但是我发现了findcontrol方法的一个好的优点。前台绑定方法如下&#xff1a;<asp:Repeater ID"Repeater1" runat"server"> <ItemTem…...