常见几种设计模式之代理模式

目录
一、创建型
1.单例模式
2.工厂模式
3.原型模式
二、结构型
1.享元模式
2.代理模式
(1)传统方式(展示网站)
(2)静态代理
(3)JDK动态代理
(4)Cglib代理
(5)几种变种代理
三、行为型
1.模板模式
2.职责链模式

(1)传统方式(展示网站)

(1)为一个对象提供一个"替身"来控制[被代理对象]的访问,也就是代理访问目标对象
[好处]:在目标对象实现基础上,增强额外功能,即扩展对象的功能
(2)代理的三种方式
---静态代理
---JDK动态代理(也叫接口代理)
---Cglib动态代理(可以在内存动态创建对象,而且不需要实现接口,也属于动态代理范畴)
(3)代理的对象:创建开销大的对象,需要安全控制的对象
[如权限控制,日志]:这些都是重复性的代码,每个类都写上这些功能就冗余,维护也麻烦,所以需要动态代理来增强对应的类

(2)静态代理

1.项目:代课老师帮班主任上课

(1)目标类和代理类都需要实现同一个接口或者继承相同的父类
(2)步骤:
2.1:目标类TeacherDao和代理类TeacherDaoProxy都实现接口ITeacherDao
2.2:在代理类中聚合了目标类,当我们调用代理类的方法,代理类的teach方法则会调用目标类的teach方法
2.3:代理对象和目标对象需要实现相同的接口,通过调用[相同]的方法来调用目标对象的方法

2.优缺点

(1)优:不修改目标类的代码前提下,通过代理类对目标类功能进行扩展增强
(2)缺:因为代理对象和目标对象需要实现相同的接口,所以很多的代理类就会产生很多的接口,目标对象和代理对象都需要维护


image-20201208150507742.png

(3)JDK动态代理

1.定义

(1)代理对象不需要实现接口,但是目标对象需要实现接口
(2)通过JDK的API动态地在内存构建代理对象,也叫做JDK代理,接口代理
(3)工厂类通过getProxyInstance方法获取代理对象
3.1:使用的API为Proxy.newProxyInstance方法,需要接受三个参数
// 反射获取代理类 3个参数(loader加载器,接口,处理器handler)
// 1.ClassLoader loader : 当前目标对象使用的类加载器
// 2.Class[] interfaces : 目标对象实现的接口类型,泛型确认类型
// 3.InvocationHandler h : 执行目标方法会触发事情处理器方法,会把当前指向的目标对象作为参数传入
3.2:代理类所在包,java.lang.reflect.Proxy

2.补充

(1)内存中动态生成的代理对象(继承了proxy,实现了ITeacherDao接口,聚合了Handler)
(2)内存中构建对象,可以是通过发射动态创建对象,不需要我们主动去new代理对象
(3)不能代理被final修饰的类


image-20201208160422325.png

(4)Cglib代理

1.介绍

(1)静态代理和JDK动态代理都要在目标对象实现一个接口,当目标对象没有任何接口的时候,那么就可以使用Cglib代理
(2)Cglib:也叫做子类代理,在内存构建一个子类实现对目标对象功能扩展
(3)代码生成包:Cglib是一个高性能的代码生成包,在可Java程序运行期间扩展Java类
[场景:用于需要AOP框架,Spring AOP的方法拦截]

2.注意

(1)Cglib包的底层使用字节码来处理框架ASM来转换成字节码并生成新的类
[ASM是一种通用Java字节码操作和分析框架。它可以用于修改现有的class文件或动态生成class文件。]
(2)引入cglib的四个jar包
--asm.kar
--asm-common.jar
--asm-tree.jar
--cglib-2.2.jar
(3)在内存中动态生成子类,那么目标类不能为final,否则报错
[java.lang.IllegalArgumentException]
(4)目标对象方法不能为final / static,否则就不会被拦截,也意味着方法无法被增强

3.补充

(1)Cglib:目标对象不需要实现接口,代理对象也没有接口,只有创建代理对象的工厂需要引入4个jar包和实现MethodIntercept接口

4.运行报错

[java.lang.VerifyError: class net.sf.cglib.core.DebuggingClassWriter override]
cglib版本和asm版本不匹配,直接用spring框架的就行了,或者去找对应的版本


image-20201208193427482.png

(5)几种变种代理

(1)防火墙代理(内网穿透):内网通过代理穿透防火墙,实现对公网的访问
(2)缓存代理:页面请求图片资源,先到缓存代理取,没有取不到资源,则从数据库取或者公网取,然后缓存
(3)远程代理(当作本地对象-图解):通过它可以将远程对象当作"本地对象",远程代理 ----通过网络---> 和真正的远程对象沟通信息
(4)同步代理:主要使用在多线程,完成多线程的同步工作,EntryList队列的线程由同步代理管理(可以使用加锁,代码块)


image-20201208194934726.png

你可能感兴趣的:(常见几种设计模式之代理模式)