type
status
date
slug
summary
tags
category
icon
password
AI summary
一、基本介绍
1、为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。
2、代理模式有不同的形式, 主要有静态代理和动态代理, 动态代理分为JDK代理和 Cglib代理 (可以在内存动态的创建对象,而不需要实现接口)。

二、分类
2.1 静态代理
静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一起实现相同的接口或者是继承相同父类
例如:读大学的时候,大家都有遇到过这样的事情吧。某一天你走在校园的林荫小道上,路过了一个漂亮的女生,这时你的内心波涛汹涌,暗暗发誓她一定要成为你的女朋友。但是你直接上去联系或者表达好感这样会有点太唐突了,于是你迂回战术,
先跟她的室友闺女拉近关系,让她帮忙送礼物
给你的女神,然后。。。

首先得出现一个美女:BeautifulGirl
然后是抽象主题,送礼物:SendGift
你小子准备好礼物:You
她得室友闺蜜(代理对象)负责送礼物:HerTeam
最终礼物是成功送了出去,你也捕获到你女神的芳心了。。。
运行结果 小甜甜送你一个卡片 小甜甜送你一束花 小甜甜送你一束花
总结: 优点:体会到了代理模式的好处,一定的程度上降低了系统的耦合度,保护了被代理对象 缺点:一旦新增了接口,就要再次维护代理对象和被代理对象
2.2 jdk动态代理
基于jdk的反射机制,在java.lang.reflect.Proxy下面 通过调用newProxyInstance方法得到代理对象,前提是要实现接口newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) 例如:每个男人都有信仰,都希望成为超人,拯救地球维护世界和平,但是归根结底还是人类,需要饮食。。。
抽象主题,信仰,吃饭:Man
有思想需要饱腹一日三餐的人类:Human
基于jdk的动态代理,获取代理对象:ProxyFactory
测试运行:ProxyTest
运行结果 I believe i can fly 吃:小火锅 总结: 特点:不用每次都像静态代理那样,生成代理对象了,只需要实现接口即可获得
2.3 cglib动态代理
Cglib代理也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能扩展, 有些书也将Cglib代理归属到动态代理。Cglib包的底层是通过使用字节码处理框架ASM来转换字节码并生成新的类。
注意:使用前可以下载cglib的官方jar包,更方便的方式直接导入maven依赖

例如:生活中我们常常需要找房子,这时我们通过房产中介就能很快的找到房子,我们只需要付定金就行了
我,需要找房子,我只要付钱就好了:Person
基于cglib的动态代理,获取代理对象:ProxyUtils
代理测试:ProxyTest
运行结果: 代理对象在帮忙找房子 付定金 总结: 特点:cglib是基于创建子类对象而产生的,不用像静态代理和jdk代理需要实现定义接口。 在AOP编程中如何选择代理模式: 目标对象需要实现接口,用JDK代理 目标对象不需要实现接口,用Cglib代理
- 作者:IT小舟
- 链接:https://www.codezhou.top/article/JAVA%E3%80%90%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E3%80%91%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F%EF%BC%88proxy%EF%BC%89
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。