代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。
被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象
代理模式有不同的形式, 主要有三种 静态代理、动态代理 (JDK 代理、接口代理)和 Cglib 代理 (可以在内存
动态的创建对象,而不需要实现接口, 他是属于动态代理的范畴)
代理模式示意图
静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一起实现相同的接口或者是继
承相同父类
看具体要求
思路分析图解:
代码实现
https://gitee.com/luan_hao/design-pattern/tree/master/src/main/java/com/lh/proxy/staticproxy
应用实例要求
将前面的静态代理改进成动态代理模式(即:JDK 代理模式)
思路图解(类图)
代码实现
https://gitee.com/luan_hao/design-pattern/tree/master/src/main/java/com/lh/proxy/dynamic
需要引入 cglib 的 pom 文件
在内存中动态构建子类,注意代理的类不能为 final,否则报错
java.lang.IllegalArgumentException:
目标对象的方法如果为 final/static,那么就不会被拦截,即不会执行目标对象额外的业务方法.
https://gitee.com/luan_hao/design-pattern/commit/5136f4a8ff19a3f9f508a27a5b3fac803a6c49f5
应用实例要求
将前面的案例用 Cglib 代理模式实现
思路图解(类图)
代码实现:
https://gitee.com/luan_hao/design-pattern/tree/master/src/main/java/com/lh/proxy/cglib
防火墙代理
内网通过代理穿透防火墙,实现对公网的访问。
缓存代理
比如:当请求图片文件等资源时,先到缓存代理取,如果取到资源则 ok,如果取不到资源,再到公网或者数据库取,然后缓存。
远程代理
远程对象的本地代表,通过它可以把远程对象当本地对象来调用。远程代理通过网络和真正的远程对象沟通信息。
同步代理:主要使用在多线程编程中,完成多线程间同步工作