什么是代理模式,简单的来说代理模式是使用代理对象完成用户请求,屏蔽用户对真实对象的访问。比如日常生活中的房屋中介,他们代理房主去出售房间,而不用房主亲自出马,客户直接接触的是中介,并不能接触到房主,这样节约了房主的时间,也保护了房主的隐私。
代理模式的结构
角色 | 作用 |
---|---|
主题接口(抽象角色) | 定义代理类和真实主题的公共对外方法,也可以称之为抽象角色 |
真实主题(真实角色) | 真正实现真正业务逻辑的类,也称之为真实角色 |
代理类(代理角色) | 用来代理和封装真实角色 |
main | 客户端 |
代理模式的作用
(1)延迟加载
延迟加载主要提升系统的性能和反应速度。比如:提高系统的开启时间。
思想: 对于暂时没有用的组件,暂时不用初始化它,使用代理类来代理它的位置,只用真正使用它时再去初始化它,这样就可以分散系统的压力,避免了重量级对象初始化操作的叠加造成系统启动慢。同时如果在本次系统的操作过程中没有用到这个组件,使用代理模式就避免了这个重量级对象的初始化造成系统性能的浪费。
使用场景:使用轻量级对象代理重量级对象。
(2)保护真实对象(安全)
对于比较重要的对象,由于安全原因最好不能直接暴露出去,屏蔽客户端的直接访问,就需要代理对象去进行代理操作。由于中间这一层的代理,保护了真实对象。就如上面所说的访问中介。
代理模式有哪几种
(1) 静态代理
(2)动态代理
a、 JDK自带的动态代理: 这种动态代理使用简单,内置在JDK中,不需要引入第三方包,但相对其他动态代理功能比较弱
b、 CGLIB和Javasist 都是高级的字节码生成库,总体性能比JDK自带的动态代理好,功能也十分强大,但是得引入相应的包。
c、ASM动态代理时低级的动态代理,是动态代理中性能最好的,对开发人员的要求最高,使用特别繁琐,因此维护性差时不会使用。一般推荐使用CGLIB和Javasist。