五分钟理解设计模式之代理模式

代理模式的优缺点和使用场景 阅读详情

定义

    ​    ​代理模式(Proxy Pattern)的定义也非常简单,是指为其他对象提供一种代理,以控制对这个对象的访问。代理对象在客服端和目标对象之间起到中介作用,代理模式属于结构型设计模式。

    ​    ​代理其实就是在原本逻辑前后增加一些逻辑,而调用者无感知

 

分类

  • 静态代理

  • 动态代理

    • jdk动态代理

    • cglib动态代理

 

目的

  • 保护目标对象

  • 增强目标对象

 

静态代理

场景

    ​    ​人到了适婚年龄,父母总是迫不及待希望早点抱孙子。而现在社会的人在各 种压力之下,都选择晚婚晚育。于是着急的父母就开始到处为自己的子女相亲,比子女自己还着急。这个相亲的过程,就是一种我们人人都有份的代理

顶层接口Person

public interface Person {​    void findLove();}

儿子要找对象,实现Son类

public class Son implements Person{​    public void findLove(){        System.out.println("儿子要求:肤白貌美大长腿");    }}

但是儿子比较忙去不了,只能父母帮忙去相亲了,创建father类

public class Father implements Person {    private Son person;​    public Father(Son person){        this.person = person;    }​    public void findLove(){        System.out.println("父亲物色对象");        this.person.findLove();        System.out.println("双方父母同意,确立关系");    }​}

测试类

 Father father = new Father(new Son()); father.findLove();

 

动态代理

先看jdk代理的实现方式

我们还以找对象为例,但是这个时候需要将找对象扩展为一个产业,进而出现媒婆等更加复杂的业务场景

创建婚介所类

public class JDKMeipo implements InvocationHandler {​    private Object target;    public Object getInstance(Object target) throws Exception{        this.target = target;        Class<?> clazz = target.getClass();        return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);    }​    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        before();        Object obj = method.invoke(this.target,args);        after();       return obj;    }​    private void before(){        System.out.println("我是媒婆,我要给你找对象,现在已经确认你的需求");        System.out.println("开始物色");    }​    private void after(){        System.out.println("OK的话,准备办事");    }}

假如是女孩找对象,创建类

public class Girl implements Person {    public void findLove() {        System.out.println("高富帅");        System.out.println("身高180cm");        System.out.println("有6块腹肌");    }}

测试类

Object obj = new JDKMeipo().getInstance(new Girl());obj.findLove();

CGLib

看下cglib找对象的实现

创建媒婆类

public class CGlibMeipo implements MethodInterceptor {​​    public Object getInstance(Class<?> clazz) throws Exception{        //相当于Proxy,代理的工具类        Enhancer enhancer = new Enhancer();        enhancer.setSuperclass(clazz);        enhancer.setCallback(this);        return enhancer.create();    }​    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {        before();        Object obj = methodProxy.invokeSuper(o,objects);        after();        return obj;    }​    private void before(){        System.out.println("我是媒婆,我要给你找对象,现在已经确认你的需求");        System.out.println("开始物色");    }​    private void after(){        System.out.println("OK的话,准备办事");    }}

 

创建顾客类

public class Customer {​    public void findLove(){        System.out.println("儿子要求:肤白貌美大长腿");    }}

 

测试类

 Customer obj = (Customer) new CGlibMeipo().getInstance(Customer.class);            System.out.println(obj);            obj.findLove();

    ​    ​CGLib 代理的目标对象不需要实现任何接口,它是通过动态继承目标对象实现的动态代理

 

CGLib 和 JDK 动态代理对比

  • JDK 动态代理是实现了被代理对象的接口,CGLib 是继承了被代理对象。 

  • JDK 和 CGLib 都是在运行期生成字节码,JDK 是直接写 Class 字节码,CGLib 使用 ASM 框架写 Class 字节码,Cglib 代理实现更复杂,生成代理类比 JDK 效率低。 

  • JDK 调用代理方法,是通过反射机制调用,CGLib 是通过 FastClass 机制直接调用方法, CGLib 执行效率更高。

CGLib 执行效率更高原因​:

    ​    ​CGLib 动态代理执行代理方法效率之所以比 JDK 的高是因为 Cglib 采用了 FastClass 机 制,它的原理简单来说就是:为代理类和被代理类各生成一个 Class,这个 Class 会为代 理类或被代理类的方法分配一个 index(int 类型)。这个 index 当做一个入参,FastClass就可以直接定位要调用的方法直接进行调用,这样省去了反射调用,所以调用效率比 JDK 动态代理通过反射调用高。


Spring中的代理选择原则

1、当 Bean 有实现接口时,Spring 就会用 JDK 的动态代理 

2、当 Bean 没有实现接口时,Spring 选择 CGLib。

3、Spring 可以通过配置强制使用 CGLib,只需在 Spring 的配置文件中加入如下代码:

<aop:aspectj-autoproxy proxy-target-class="true"/>

 

总结​:

静态代理和动态的本质区别

1、静态代理只能通过手动完成代理操作,如果被代理类增加新的方法,代理类需要同步新增,违背开闭原则。 

2、动态代理采用在运行时动态生成代码的方式,取消了对被代理类的扩展限制,遵循开闭原则。 

3、若动态代理要对目标类的增强逻辑扩展,结合策略模式,只需要新增策略类便可完成,无需修改代理类的代码。


代理模式优点

1、代理模式能将代理对象与真实被调用的目标对象分离。 

2、一定程度上降低了系统的耦合度,扩展性好。 

3、可以起到保护目标对象的作用。 

4、可以对目标对象的功能增强。

 

代理模式缺点

1、代理模式会造成系统设计中类的数量增加。 

2、在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢。 

3、增加了系统的复杂度。

​

CSP-J 复试考点 可以用来训练思维,对于学习时间短的同学,动态规划可以帮助你迅速进入编程状态,也有助于帮你发现题目背后可能隐藏的更简便的算法。动态规划、贪心都是和子问题相关的,动态规划的基本思想是将一个大的问题划分成子问题,接着分别求解,而且能够将一些重复的计算记忆化,大大提高效率。难度加大,会涉及到二分、动态规划之类的算法,容易遗漏考虑点,不易得全分,考试的时候要注意全面性。一般是压轴题,算法不明显,剪枝的搜索、动态规划、状压 DP、树形 DP 、树、图等。枚举算法是指,列举出所有可能的取值,从中找出最优解。 阅读详情

相关推荐

pcle接口详解&用途说明

它原来的名称为“3GIO”,由英特尔在2001年提出。pcel x16插槽 用途用于显卡、RAID阵列卡,向下兼容PCIE x1/x4/x8/x16。(PCIE x16插槽长89mm,有164根针脚,靠主板外侧端有一卡口,将16x分为前后两组,短插槽有22根针脚,主要用于供电,长插槽142根,主要用于数据传输,具有16通道所带来的高带宽)PCI-E x8插槽插槽用途:全长56mm,有98根针脚,与PCI-E x16比较,主要是数据针脚减少至76根,短的供电针脚仍然是22针脚。

qq_43289307的博客 1万+

Java 代理模式的基本概念、使用场景、应用示例和实现方法

代理模式是一种结构型设计模式,它允许我们通过添加一个代理对象来控制对另一个对象的访问。代理对象和实际对象具有相同的接口,使得客户端在不知情的情况下可以使用代理对象进行操作。代理对象在与客户端进行交互时,可以控制对实际对象的访问,以实现一些额外的功能,例如访问计数、延迟加载、权限控制等。在 Java 中,代理模式主要有两种实现方式:静态代理和动态代理。静态代理需要手动编写代理类,通常需要针对每个实际对象编写一个代理类,在系统中管理多个代理类比较麻烦。

网络技术联盟站 3688

[CTFSHOW]JWT

文章目录前言JWT简介CTFSHOW Web345CTFSHOW Web346前置知识开始做题CTFSHOW Web347CTFSHOW Web348CTFSHOW Web349CTFSHOW Web350前置知识利用WP如何防御 前言 有些师傅向我咨询WP,索性就发了吧,其实早就写好了,只是懒,在github仓库里囤着 JWT简介 可以看看我的Github总结给自己看的,Y4tacker CTFSHOW Web345 首先打开题目,查看源码,接下来访问/admin被跳转回主页啥也没有发生 where is

Y4tacker的博客 6045

【设计模式】代理模式-原理、实现以及应用场景

代理模式(Proxyy)就是在不改变原始类(或叫做被代理类)代码的情况下,通过引入代理类来给原始类附加功能。

masetLI的博客 3783

PVE启动卡在loading initial ramdisk

pve显卡直通导致的异常解决

学而时习之 6688

CTF-Web学习笔记:服务端请求伪造(SSRF)篇

本文系统介绍了CTF比赛中SSRF漏洞的攻防技术。首先解析了SSRF的核心原理,即利用服务器对用户输入URL的未校验缺陷,诱导其访问内网资源。然后详细分析了5类常见CTF题型:文件读取、内网探测、云服务元数据窃取、协议绕过及组合漏洞利用。重点讲解了绕过URL过滤、利用特殊协议(如dict://、gopher://)等实战技巧,并通过一道SSRF+Redis的高阶题目演示完整攻击链。最后给出防御建议:严格校验输入URL、禁用危险协议、实施内网隔离等。

Deng7326的博客 1704

设计模式之代理模式

代理模式 所有代码地址: https://gitee.com/zyxscuec/Design-pattern.git 文章目录代理模式(1) 概念(2)适用场景(3)代码示例1. 静态代理模式2. 动态代理模式(4) 模式在源码中的体现(5)代理模式的优缺点(6) 动态代理模式和静态代理模式的区别 (1) 概念 代理模式(ProxyPattern)的定义也非常简单,是指为其他对象提供一种代理,以控制对这个对象的访问。 代理对象在客服端和目标对象之间起到中介作用,代理模式属于结构型设计模式。 (2)适用场景

子冉冰清的博客 893

三款云电脑实测:ToDesk、青椒云、顺网云谁更适合AIGC新手?附详细配置对比

本文针对AIGC新手,深度实测了ToDesk云电脑、青椒云和顺网云三款云电脑服务。通过对比上手门槛、内置生态、操作引导及成本,发现ToDesk云电脑凭借一键启动、丰富预置模型和直观引导,为新手提供了最接近“开箱即用”的零门槛AIGC创作体验,是快速入门AI绘画的高效选择。

assembly8low的博客 1095

java设计模式---代理模式详解

代理模式超级详解

zhenghuishengq的博客 2197

【WRF-UCM】BEP+BEM 模拟:README

【WRF-UCM】BEP+BEM 模拟:README

WW、forever的博客 223

Motoman机器人离线编程——Motocom32开发简介

欢迎关注Jungle的Motoman机器人离线编程专栏系列文章: Motoman机器人离线编程——Motocom32开发简介 Motoman机器人离线编程——Visio Studio环境配置 Motoman机器人离线编程——Motocom32库函数的使用与封装 Motoman机器人离线编程——Motocom32参考文献及注意事项 Motoman机器人离线编程——MotocomES介绍 ...

冯Jungle的个人博客 8713

五分钟学会JAVA设计模式-代理模式

设计模式-代理模式代理模式分三种静态代理jdk动态代理cglib动态代理 代理模式分三种 静态代理 jdk动态代理 使用jdk动态代理时我们需要先创建一个接口、一个继承该接口的类和一个代理类 (如:接口 IUserService、继承类UserService、代理类ProxyPattern) 为了更容易理解代理模式,我在里面还添加了一个User类 //User类 public class Us...

梦屿千寻的博客 240

YOLOv11训练:Roboflow免费数据集获取与格式转换超详细教程

公共数据集库:包含超过20,000个开源数据集数据标注工具:支持在线标注和团队协作数据预处理:自动增强、扩充和格式化版本控制:像管理代码一样管理数据集版本多格式导出:支持所有主流目标检测格式import cv2# 加载图像# 加载标注# 数据增强# 调整尺寸# 调整标注坐标# 转换为Tensor# 实现保持长宽比的resize逻辑pass# 坐标转换逻辑pass# 数据增强实现pass数据集选择优先选择Roboflow上标注质量高的官方数据集。

weixin_39818775的博客 2362

设计模式快速入门

设计模式是针对软件设计常见问题的可重用解决方案,提供最佳实践模板而非具体代码。主要分为三类:创建型(如单例、工厂模式)、结构型(如适配器、代理模式)和行为型(如策略、观察者模式)。学习建议:1)理解模式原理和UML类图;2)通过代码示例实践;3)在项目中识别适用场景。推荐《Head First设计模式》等资源,强调避免过度设计,以"理论-实践-应用"循环深入掌握,最终实现灵活运用。

2301_81211133的博客 309

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

设计模式六大原则_教你五分钟速记六大原则-23种设计模式

六大原则:1、开闭原则(对扩展开放,对修改关闭)2、里氏代换原则(任何基类可以出现的地方,子类一定可以出现)3、依赖倒转原则(真对接口编程,依赖于抽象而不依赖于具体。)4、接口隔离原则(使用多个隔离的接口,比使用单个接口要好)5、迪米特法则(:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立)6、合成复用原则(原则是尽量使用合成/聚合的方式,而不是使用继承。)创建型模式,共...

weixin_39801714的博客 248

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

《深入浅出设计模式》(Head First Design Patterns)第15届JOLT获奖作品(附pdf中文文档和源码)...

大致浏览这本书,会发现上面有好多的图片,好多好玩的对话,很多人会感觉这是一本轻松愉快的书。但是请记住:这本书不是花两天时间,一边看片,一边上网能读完的书,读这本书需要完全的集中精力,需要深入的思考,甚至做笔记。记得当年我看完Design Pattern Explained,总共只用了两天时间,感觉对它掌握得也相当不错。但是读完这本书我整整花了七天时间,而且读完一些章节后会感觉头脑有点爆炸。 ...

zfmsa--装疯卖傻 435

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Head First Design Patterns(深入浅出设计模式)-目录

目录序你的大脑是如何理解设计模式的?此时,你正在设法学习些知识,而你的大脑要通过确认这些知识来给你提供支持。你的大脑在想:“最好出去做些更重要的事情,就象消灭野兽或者光着身子滑雪不是个好主意”。所以你要怎么样让你的大脑认为你的生死存亡都依赖于设计模式的知识? 1.Welcome to Design Patterns - 设计模式介绍 有人已经解决了你的...

weixin_34308389的博客 315

设计模式之——单例模式

前言: 单例模式:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式。 特点: 单例类只有一个实例对象 该单例对象必须由单例类自行创建 单例类对外提供一个访问该单例的全局访问点 注意: 普通类的构造函数是公有的,外部类可以通过“new 构造函数()”来生成多个实例。但是,如果将类的构造函数...

Dream_xun的专栏 392

学习java知识链接

一.RabbitMq 1.springBoot 整合RabbitMq使用 https://blog.youkuaiyun.com/leilei1366615/article/details/107373033/ 二.Spring

q513485326的博客 194

从Swagger到ReDoc:5分钟搞定高颜值API文档生成(附完整配置流程)

本文详细介绍了如何从Swagger快速迁移到ReDoc,以生成高颜值、交互性强的API文档。通过使用redoc-cli工具,开发者可在5分钟内将OpenAPI规范文件转换为独立的静态HTML文档,并提供了完整的配置流程、自定义主题方法以及CI/CD集成方案,显著提升API文档的可读性和团队协作效率。

gan8painter的博客 475

mybatis总结

mybatis源码分析学习总结

hq091117的博客 685

我在其他社区的问答及博文

你好,我是果冻,希望我的文章可以帮助到你。我的知乎主页:点击进入,我的掘金社区主页:点击进入。 文章目录问答物联网文章人工智能工程化(MLOps)和果冻一起学AI和果冻一起学设计模式色彩与美学和果冻一起探索JVM其他 问答 物联网 物联网工程主要学什么课程? 物联网工程毕业的都做什么工作了? 学物联网工程的女生以后可以做什么工作呢?(不想当程序猿敲一辈子代码) 文章 人工智能工程化(MLOps) 浅析数据工作流Prefect 五分钟快速了解Airflow工作流 开源机器学习工作流Ploomber .

吃果冻不吐果冻皮 956

200篇原创文章汇总,请收藏!

你好,我是田哥。有朋友私信我,建议我把之前的原创文章整理一下,刚好这个端午节有空,我就给大家整理出了一个小册子。不知不觉,居然写了200+篇原创文章,部分也有划水的。但是还是有很多文章得到了粉丝朋友们和公众号号主们的青睐。下面举几个栗子:美团面试:如何设计一个注册中心?代码太烂,可能是他离职的原因吧!一周学完MyBatis源码,万字总结HashMap的31连环炮,我...

田维常 637

这才是你需要的 C 语言、C++ 学习路线!

点击关注上方“五分钟学算法”,设为“置顶或星标”,第一时间送达干货。转自CodeSheep小伙伴们,大家好。关于C语言和C++的学习路线终于梳理完了。当然我也只能从我曾经近3年的通信公...

程序员吴师兄的博客 935

2024年最新为什么很多企业都是面试造火箭,入职拧螺丝?,八年Java开发心路历程

上述知识点,囊括了目前互联网企业的主流应用技术以及能让你成为“香饽饽”的高级架构知识,每个笔记里面几乎都带有实战内容。打个比方,假如你正在学习 spring 注解,突然发现了一个注解@Aspect,不知道干什么用的,你可能会去查看源码或者通过博客学习,花了半小时终于弄懂了,下次又看到@Aspect 了,你有点郁闷了,上次好像在哪哪哪学习,你快速打开网页花了五分钟又学会了。从半小时和五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。

2301_76348206的博客 469

技术面试中的幽默表达与核心知识点解析

在技术面试中,如何平衡专业深度与表达趣味性成为许多候选人关注的焦点。从计算机科学基础概念出发,数据结构如红黑树、算法如LRU缓存机制,到Java核心知识点如Spring IoC容器、MyBatis的SQL注入防护,都是面试常见考点。理解这些技术的底层原理,例如JVM内存模型、并发编程的Happens-Before规则,不仅能展现技术深度,也为幽默表达提供了扎实基础。在实际工程应用中,Redis内存淘汰策略、设计模式如工厂方法和装饰器模式,都是高频出现的实战场景。通过生活化类比和可视化表达,候选人可以在保持技

weixin_30376509的博客 410
上一篇: 设计模式之委派模式和策略模式
下一篇: 设计模式之模板模式
JackRenEngineer
博客等级 码龄10年 37粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值