金三银四面试题(二十一):代理模式知多少?

代理模式在软件开发中是一个非常重要的设计模式之一。它提供了一种灵活的方式来控制和管理对象的访问,并且可以在访问对象前后执行额外的操作。

什么是代理模式

代理模式是一种结构型设计模式,其目的是为其他对象提供一种代理以控制对这个对象的访问。代理对象通常充当客户端与真实对象之间的中介,客户端通过代理对象访问真实对象,从而可以在访问前后进行一些额外的控制、管理或者操作。

代理模式通常包括以下角色:

  1. 抽象主题(Subject):声明真实对象和代理对象的共同接口,这样客户端可以通过这个接口访问真实对象或代理对象。

  2. 真实主题(Real Subject):定义了代理所代表的真实对象,客户端最终想要访问的对象。

  3. 代理(Proxy):保存一个引用使得代理可以访问实体,并且提供一个与真实主题相同的接口,这样代理就可以替代真实主题。

代理模式通常有以下几种常见的应用场景:

  • 远程代理(Remote Proxy):用于代表不同地址空间中的对象。通过远程代理,客户端可以访问远程服务器上的对象。

  • 虚拟代理(Virtual Proxy):用于代表比较消耗资源的对象。虚拟代理延迟加载(lazy initialization)真实对象,直到客户端真正需要访问它为止。

  • 保护代理(Protection Proxy):用于控制对对象的访问。保护代理可以根据调用者的身份、权限等条件决定是否允许访问对象的某些方法。

  • 缓存代理(Cache Proxy):用于提高系统的性能。缓存代理在第一次访问真实对象时,将结果缓存起来,以后的访问可以直接返回缓存的结果,避免重复执行相同的操作。

代理模式能够有效地提供额外的控制和管理,同时也能够提供更好的性能和资源利用。

例子

生活中的例子

  • 黄牛卖火车票:没有流行网络购票的年代是很喜欢找黄牛买火车票的,因为工作忙的原因,没时间去买票,然后就托黄牛给你买张回家过年的火车票。这个过程中黄牛就是代理人,火车票就是被代理的对象。

  • 婚姻介绍所:婚姻介绍所的工作人员,搜集单身人士信息,婚介所的工作人员为这个单身人士找对象,这个过程也是代理模式的生活案例。对象就是被代理的对象。

动态代理和静态代理

动态代理和静态代理都是代理模式的两种实现方式,它们都用于控制对对象的访问,并在访问对象前后执行额外的操作,但它们的实现方式和特点有所不同。

  1. 静态代理

    • 静态代理是在编译时期就已经确定了代理类和真实类的关系,代理类是通过手动编码实现的。
    • 在静态代理中,代理类和真实类通常都要实现同一个接口,代理类中包含了对真实对象的引用,并且在方法调用前后执行额外的操作。
    • 静态代理的一个缺点是如果要代理的对象过多,可能会导致代理类的数量过多,增加了代码的复杂性和维护成本。
  2. 动态代理

    • 动态代理是在运行时动态生成代理类的方式实现的,它允许在运行时动态地创建代理对象。
    • 在动态代理中,代理类是由代理工厂根据指定的接口和方法来动态生成的,并在方法调用时通过方法拦截器来执行额外的操作。
    • 动态代理的一个优点是可以减少代码量,因为代理类是动态生成的,不需要手动编写大量的代理类。同时,动态代理也更加灵活,可以代理任意的接口和类,不受静态代理中接口的限制。

总的来说,静态代理在编译时期确定了代理关系,适用于一些固定且较少变化的场景,而动态代理在运行时动态生成代理类,适用于需要灵活处理对象的访问和操作的场景。在 Java 中,JDK 动态代理和 CGLIB 动态代理是两种常见的动态代理实现方式,它们都能够实现在运行时动态生成代理类,并在方法调用时执行额外的操作。

spring中的动态代理

在 Spring 框架中,动态代理是 AOP(面向切面编程)的一个重要实现方式之一。AOP 允许开发者在程序运行期间动态地将额外的逻辑(称为切面)织入到现有的代码中,而动态代理正是实现这一功能的一种手段。

Spring 中的动态代理主要基于 JDK 动态代理和 CGLIB(Code Generation Library,代码生成库)两种技术。下面分别简要介绍这两种动态代理的实现方式:

  1. JDK 动态代理

    • JDK 动态代理是通过反射机制在运行时动态创建代理类的方式实现的。它要求目标对象必须实现一个或多个接口,然后基于这些接口创建代理对象。
    • 在 Spring 中,当目标对象实现了接口时,Spring 会使用 JDK 动态代理来创建代理对象。代理对象会实现目标对象所实现的接口,并在方法调用时委托给 InvocationHandler 来处理。
  2. CGLIB 动态代理

    • CGLIB 动态代理是通过继承目标对象并重写其方法的方式实现的。它不要求目标对象必须实现接口,可以对任意的类进行代理。
    • 在 Spring 中,当目标对象没有实现接口时,Spring 会使用 CGLIB 动态代理来创建代理对象。代理对象会继承目标对象,并在方法调用时通过方法拦截器(MethodInterceptor)来处理。

Spring 中动态代理的实现主要依赖于 Proxy 类和 ProxyFactory 工厂类。Spring 提供了两种方式来创建代理对象:基于接口的 JDK 动态代理和基于类的 CGLIB 动态代理。在使用 Spring AOP 时,开发者可以选择合适的代理方式来实现切面功能,并通过配置文件或注解来指定切面的切入点和通知类型。这样就可以在程序运行期间动态地将切面织入到目标对象的方法调用中,实现各种横切关注点的功能,例如日志记录、性能监控、事务管理等。

代码实现

静态代理

// 定义接口
interface Calculator {int add(int a, int b);
}// 实现接口的类
class CalculatorImpl implements Calculator {@Overridepublic int add(int a, int b) {return a + b;}
}// 代理类
class CalculatorProxy implements Calculator {private final Calculator target;public CalculatorProxy(Calculator target) {this.target = target;}@Overridepublic int add(int a, int b) {// 在方法调用前执行额外的操作System.out.println("Before method invocation");// 调用真实对象的方法int result = target.add(a, b);// 在方法调用后执行额外的操作System.out.println("After method invocation");return result;}
}public class Main {public static void main(String[] args) {// 创建真实对象Calculator calculator = new CalculatorImpl();// 创建代理对象Calculator proxy = new CalculatorProxy(calculator);// 使用代理对象调用方法int result = proxy.add(3, 4);System.out.println("Result: " + result);}
}

动态代理

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;// 定义接口
interface Calculator {int add(int a, int b);
}// 实现接口的类
class CalculatorImpl implements Calculator {@Overridepublic int add(int a, int b) {return a + b;}
}// 实现 InvocationHandler 接口来处理方法调用
class CalculatorInvocationHandler implements InvocationHandler {private final Calculator target;public CalculatorInvocationHandler(Calculator target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 在方法调用前执行额外的操作System.out.println("Before method invocation");// 调用真实对象的方法Object result = method.invoke(target, args);// 在方法调用后执行额外的操作System.out.println("After method invocation");return result;}
}public class Main {public static void main(String[] args) {// 创建真实对象Calculator calculator = new CalculatorImpl();// 创建动态代理对象Calculator proxy = (Calculator) Proxy.newProxyInstance(Calculator.class.getClassLoader(),new Class<?>[]{Calculator.class},new CalculatorInvocationHandler(calculator));// 使用代理对象调用方法int result = proxy.add(3, 4);System.out.println("Result: " + result);}
}

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

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

相关文章

【智能算法】霸王龙优化算法(TROA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2023年&#xff0c;VSDM Sahu等人受到霸王龙狩猎行为启发&#xff0c;提出了霸王龙优化算法&#xff08;Tyrannosaurus Optimization Algorithm, TROA&#xff09;。 2.算法原理 2.1算法思想 TR…

【系统分析师】系统规划

文章目录 1、项目的机会选择2、可行性分析3、成本效益分析3.1 基本概念3.2 盈亏临界分析3.3 净现值分析3.4 投资回收期 截图&#xff1a;希赛讲义 视频&#xff1a;B站 系统规划对应的是 立项 阶段 1、项目的机会选择 2、可行性分析 3、成本效益分析 3.1 基本概念 例题 3.2 盈…

边缘计算智能分析网关V4地面垃圾AI检测算法介绍及场景应用

在传统的卫生监管场景中&#xff0c;无法及时发现地面遗留的垃圾&#xff0c;通过人工巡逻的方式需要大量的人力、物力和时间&#xff0c;而且效率不高&#xff0c;并存在一定的滞后性&#xff0c;而采用地面垃圾AI检测算法则可以大大提高监管效率。 TSINGSEE青犀AI智能分析网…

windows10安装Tensorflow-gpu 2.10.0

windows10安装Tensorflow-gpu 2.10.0 本文主要目的是 从0开始演示 在windows10 平台安装Tensorflow-gpu 2.10.0。 Tensorflow-gpu 2.10.0 之后的版本&#xff0c;不再支持这样的安装方式&#xff0c;如果有需要&#xff0c;请参考wsl安装ubuntu的方式&#xff0c;进行安装。 …

短视频矩阵源头====技术文档交付

短视频矩阵源头技术文档交付 搭建短视频矩阵系统源码需要以下步骤&#xff1a; 1. 确定系统需求和功能&#xff1a;明确系统需要支持哪些功能&#xff0c;例如短视频的上传、存储、播放、分享、评论、点赞等。 2. 选择合适的编程语言和框架&#xff1a;根据需求选择合适的编程…

存储人视角:人工智能AI + 大模型

原文来自于知乎存储专栏&#xff1a; 存储人视角&#xff1a;人工智能AI 大模型 前沿 我的角色 背景 AI 出场 效果 一个宠娃狂魔 娃喜爱并有奥特曼玩具 她的奥特曼玩具会跳舞了 娃对我的崇拜和爱又多了一分......amazing 杭州网商路艾弗森 球队需要制作LOGO 形象生动…

【办公软件word小技巧】如何一键提取word中的图片 几十张 几百张均可一键提取

在日常生活和工作中&#xff0c;我们经常会遇到需要从Word文档中提取图片的情况。无论是为了单独保存这些图片&#xff0c;还是为了在其他地方使用它们&#xff0c;一键提取Word中的图片都是一个非常实用的技能。提取Word文件中的图片并不是一件复杂的事情&#xff0c;只要掌握…

照片jpg格式小于50kb怎么弄?jpg压缩到指定大小

我们经常需要处理大量的图片&#xff0c;特别是在分享到社交媒体时&#xff0c;然而&#xff0c;图片文件的大小常常成为困扰我们的问题&#xff0c;尤其是当我们的设备存储空间有限时。有些平台甚至会需要将图片压缩到50kb大小&#xff0c;那么&#xff0c;如何有效地压缩图片…

WAF攻防-权限控制代码免杀异或运算变量覆盖混淆加密传参

知识点 1、脚本后门基础&原理 2、脚本后门查杀绕过机制 3、权限维持-覆盖&传参&加密&异或等 章节点&#xff1a; WAF绕过主要集中在信息收集&#xff0c;漏洞发现&#xff0c;漏洞利用&#xff0c;权限控制四个阶段。 代码表面层免杀-ASP&PHP&JSP&a…

电商数据接口开发|淘宝商品接口|天猫商品接口|京东商品接口|拼多多商品接口|API接口申请指南

电商数据接口开发涉及到多个电商平台&#xff0c;包括淘宝、天猫、京东和拼多多等。这些平台都提供了丰富的API接口&#xff0c;以便开发者能够获取商品信息、订单数据等&#xff0c;从而构建出各种电商应用和服务。 1.请求方式&#xff1a;HTTP POST GET &#xff08;复制薇&…

Python经典游戏:乒乓球对战(单人+双人模式)

Python108款&#xff0c;小游戏集合&#xff0c;总有一个是你想要的 中国象棋 像素鸟 五子棋 24点小游戏 贪吃蛇 扫雷 俄罗斯方块 魂斗罗 消消乐 坦克大战 外星人入侵 汤姆猫 斗地主 乒乓球 推箱子 植物大战僵尸 围棋 超级玛丽 飞机大战 迷宫 滑雪 吃豆人…等等 &#xff0…

基于springboot实现信息化在线教学平台设计【项目源码+论文说明】计算机毕业设计

基于springboot实现信息化在线教学平台设计演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了信息化在线教学平台的开发全过程。通过分析信息化在线教学平台管理的不足&#xff0c;创建了一个计算机管理信息…

【OpenGL开发】PyQt在关闭应用程序时没有运行析构函数的问题

PyQt在关闭应用程序时没有运行析构函数的问题 目录 一、说明二、python的析构函数三、通用版QT5 存在一些问题四、python版PyQt5 存在一些问题五、OpenGL的析构问题5.1 OpenGL很脆弱,这不是危言耸听5.2 以上OpenGL问题解决方法六、一些保留意见一、说明 应用QT做程序界面,在…

电视盒子哪个牌子好?博主总结网络电视盒子推荐

电视盒子是我们使用最多的产品&#xff0c;追剧、游戏、上网课都离不开电视盒子&#xff0c;但很多朋友不知道电视盒子哪个牌子好&#xff0c;我这周共计测评了18款不同品牌的电视盒子&#xff0c;今天整理了五款网络电视盒子推荐&#xff0c;想买电视盒子可以看看下面这些。 第…

vscode 配置go环境

https://www.zhihu.com/question/486786946/answer/2723663432 注意一定要安装最新版,否则不容易debug //main.go package main //说明hello.go这个文件在main这个包中import "fmt" //导入内置包&#xff0c;可以使用其中函数等func main() {fmt.Println("Hello…

java 红黑树

01.红黑树的定义&#xff1a; 每一个结点有五个属性&#xff1a;

Computer Organization/Architecture 计算机组织/架构/结构 重要观念和笔记(陆续更新中,2024/04/17周三,已更新)

前情提要&#xff1a;我的说法比较白话&#xff0c;希望可以更好理解其中一些观念&#xff0c;这篇会以中文为主&#xff0c;专有名词还是用英文&#xff0c;好吧应该会中英穿插&#xff0c;自己学的时候感觉听中文会吸收比较快&#xff0c;也可能是我英文比较烂的关系&#xf…

Eagle for Mac v1.9.13注册版:强大的图片管理工具

Eagle for Mac是一款专为Mac用户设计的图片管理工具&#xff0c;旨在帮助用户更高效、有序地管理和查找图片资源。 Eagle for Mac v1.9.13注册版下载 Eagle支持多种图片格式&#xff0c;包括JPG、PNG、GIF、SVG、PSD、AI等&#xff0c;无论是矢量图还是位图&#xff0c;都能以清…

Solaris安装Oracle RAC配置手册

一. Oracle RAC安装前的系统准备工作 检查安装包 ​pkginfo –i SUNWarc SUNWbtool SUNWhea SUNWlibC SUNWlibm SUNWlibms SUNWsprotSUNWtoo pkg install SUNWarc SUNWbtool SUNWhea SUNWlibC SUNWlibm SUNWlibms SUNWsprotSUNWtoo 1.1 创建系统用户和组(两节点都要执行 ro…

通付盾APP尽职调查报告:守护移动应用安全新篇章

在数字化浪潮席卷全球的今天&#xff0c;移动应用程序已经成为我们生活中不可或缺的一部分。无论是购物、社交、娱乐还是工作&#xff0c;我们几乎每天都在与各种各样的APP打交道。然而&#xff0c;随着APP的广泛应用&#xff0c;其安全问题也日益凸显&#xff0c;成为开发者和…