type
status
date
slug
summary
tags
category
icon
password
 

一、基本介绍

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

二、分类

2.1 静态代理

静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一起实现相同的接口或者是继承相同父类
例如:读大学的时候,大家都有遇到过这样的事情吧。某一天你走在校园的林荫小道上,路过了一个漂亮的女生,这时你的内心波涛汹涌,暗暗发誓她一定要成为你的女朋友。但是你直接上去联系或者表达好感这样会有点太唐突了,于是你迂回战术,
先跟她的室友闺女拉近关系,让她帮忙送礼物
给你的女神,然后。。。
notion image
首先得出现一个美女: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依赖
notion image
例如:生活中我们常常需要找房子,这时我们通过房产中介就能很快的找到房子,我们只需要付定金就行了
我,需要找房子,我只要付钱就好了:Person
基于cglib的动态代理,获取代理对象:ProxyUtils
代理测试:ProxyTest
运行结果: 代理对象在帮忙找房子 付定金 总结: 特点:cglib是基于创建子类对象而产生的,不用像静态代理和jdk代理需要实现定义接口。 在AOP编程中如何选择代理模式: 目标对象需要实现接口,用JDK代理 目标对象不需要实现接口,用Cglib代理
 
JAVA【设计模式】单例模式JAVA【设计模式】抽象工厂模式
IT小舟
IT小舟
微信公众号:IT小舟
公告
type
status
date
slug
summary
tags
category
icon
password
notion image
你好,我是小舟。 欢迎来到我的博客,我喜欢运动、阅读、音乐和写作。如果有什么想要交流的,可以加我微信:upcodezhou。再次感谢你的光临!
notion image