设计模式之代理模式(上) 静态代理与JDK动态代理
2019独角兽企业重金招聘Python工程师标准>>>
代理模式
- 给某一个对象提供一个代理,并由代理对象控制对原对象的引用。
静态代理
静态代理是由我们编写好的类,在程序运行之前就已经编译好的的类,此时就叫静态代理。 说理论还是比较懵逼的,直接上代码:
抽象主题,可以想象成我们的业务接口。
/*** 抽象主题。* @author wushuaiping* @date 2018/3/13 下午10:13*/
public interface ISubject {/*** 比如现在有个业务功能,需要开启某项校验。*/void enableCheck();
}
真实主题,可以想象成我们对业务接口的实现类。
/*** 真实主题* @author wushuaiping* @date 2018/3/13 下午10:21*/
public class RealSubject implements ISubject {public void enableCheck() {System.out.println("我开启了某项校验~~");}
}
但是有一天,我突然想加个日志记录,但是我不想去改动原有的方法。那么我们就可以使用这种方式:
/*** 代理类* @author wushuaiping* @date 2018/3/13 下午10:23*/
public class ProxySubject implements ISubject{private ISubject subject;public ProxySubject(ISubject subject){super();this.subject = subject;}// 对被代理对象的方法进行增强public void enableCheck() {before();subject.enableCheck();after();}private void before(){System.out.println("我记录一下启动校验前的相关日志。");}private void after(){System.out.println("我记录一下启动校验后的相关日志。");}
}
我们使用静态代理后,来试试看这种方式能不能行?测试代码:
public class Main{public static void main(String[] args) throws ApiException {ProxySubject proxy = new ProxySubject(new RealSubject());proxy.enableCheck();}
}
运行结果:
我记录一下启动校验前的相关日志
我开启了某项校验~~
我记录一下启动校验后的相关日志。
静态代理模式相对比较简单,但是缺点肯定也是有的:
一个代理对象只能服务于一个类。如果有很多类需要记录日志的话,你的一个一个去实现。。累不死你。。
代理对象必须实现接口,如上。一个字:还是累。
动态代理
这里动态代理使用的是JDK的动态代理实现的,JDK的动态代理必须是目标对象实现接口才可以。也就是相当于我们上面的业务实现类(RealSubject)。使用CGLIB就不用实现接口也可完成动态代理,但是今天时间不多了,明天还得搬砖,所以先把JDK动态代理学了,明天再学学CGLIB的动态代理。 代码如下:
要实现动态代理;需要先去实现InvocationHandler接口,这个接口提供了invoke方法,该方法相信用过反射或者AOP的同学应该都比较熟悉,我这里就不多讲了。实现了这个后我们可以调用目标方法了,但是我们需要代理的对象还不知道从何而来,所以我们还需要使用JDK提供的Proxy.newProxyInstance方法,第一个参数是目标代理类的类加载器,第二个参数是目标代理类实现的接口,第三个参数的话是目标代理类的调用处理程序就是InvokeHandler啦。用该方法可以生产代理对象。
/*** 使用Java的动态代理实现* @author wushuaiping* @date 2018/3/13 下午10:43*/
public class DynamicProxy implements InvocationHandler {private Object target;public Object getProxyInstance(Object target){this.target = target;// 使用Java的获取代理实例方法来获取代理实例。。好绕啊。。反正就是获取代理实例-_-return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);}// 增强, 调用目标方法public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {before();// 因为我们需要被增强的方法enableCheck是没有返回参数的,所以不需要返回值。// 如果有返回值 Object res = method.invoke(proxy, args); return res;就可以了method.invoke(target, args);after();return null;}private void before(){System.out.println("操作之前的日志记录~~");}private void after(){System.out.println("操作之后的日志记录~~");}
}
Test case
public static void main(String[] args) throws ApiException {DynamicProxy proxy = new DynamicProxy();ISubject subject = (ISubject)proxy.getProxyInstance(new RealSubject());subject.enableCheck();}
运行结果:
操作之前的日志记录~~
我开启了某项校验~~
操作之后的日志记录~~
今天的设计模式算是学完啦,抽象工厂模式感觉我可能思维不够抽象,所以到现在还没能理解抽象工厂模式到底能干嘛?实际中有何用处?本文用于个人学习记录,有写的不好的地方,还请各位大佬指点一二!
good night!
转载于:https://my.oschina.net/u/3152087/blog/1634283
设计模式之代理模式(上) 静态代理与JDK动态代理相关推荐
- 两万字吐血总结,代理模式及手写实现动态代理(aop原理,基于jdk动态代理)
代理模式及手写实现动态代理 一.代理模式 1. 定义 2. 示例 (1)静态代理 (2)动态代理 3. 通用类图 4. 代理模式的优点 二.jdk动态代理实现原理 1. jdk动态代理源码分析(通过该 ...
- java中的静态、动态代理模式以及Spring中的CgLib动态代理解读(面试必问)
java中的静态.动态代理模式以及Spring中的CgLib动态代理解读(面试必问) 静态代理 动态代理 CgLib动态代理 基础知: 反射知识 代理(Proxy)是一种设计模式,提供了对目标 ...
- java代理(静态代理和jdk动态代理以及cglib代理)
说到代理,脑袋中浮现一大堆代理相关的名词,代理模式,静态代理,jdk代理,cglib代理等等. 记忆特别深刻的是,一次面试中,一位面试官问我,spring的AOP核心采用的设计模式是什么什么模式,阅读 ...
- 静态代理和JDK动态代理
(开发环境是MyEclipse) 静态代理示例 HellowStaticProxy代理, HellowObject被代理 HellowObject和HellowStaticProxy实现iHellow ...
- java静态代理和JDK动态代理
静态代理 编译阶段就生产了对应的代理类 public interface IBussiness {void execute(); } public class BussinessImpl implem ...
- 设计模式之代理模式(静态代理动态代理)
目录 1.什么是代理模式 2.代理模式的结构 3.代理模式的实现 3.1 静态代理和动态代理概念 3.2 静态代理 3.3 动态搭理 3.3.1 代码实现 3.3.2 Proxy类讲解 4.动态代理V ...
- 【Java】代理模式(静态代理动态代理)
CONTENT 代理模式 静态代理 动态代理 JDK 动态代理(基于接口) CGLIB 动态代理(基于类继承) JDK 动态代理 v.s. CGLIB 动态代理 JDK 动态代理为什么必须基于接口 R ...
- 代理模式 :静态代理 +动态代理(jdk实现+cglib实现)
昨天被人问及动态代理与CGlib的区别,赶紧回顾一下: 什么是代理? 静态代理与动态代理 静态代理实例 JDK动态代理实例 CGLib 简介 CGLib 与JDK动态代理的区别 代理模式是Java中常 ...
- 代理模式(静态、动态)
文章目录 一.代理模式 1.什么是代理模式 2.为什么使用代理模式 3.代理模式应用场景 4..代理模式实现原理 5.代理模式创建的方式 6.静态代理 6.1基于接口方式 6.1基于继承方式 7.动态 ...
最新文章
- 手机拍视频最怕抖,只能靠AI拯救了
- linux_软件安装策略和升级策略
- Spring 事务管理高级应用难点剖析--转
- 区块链比特币开源_开源资金:比特币,区块链和免费软件
- lintcode:最大子正方形
- Django进阶之CSRF
- ffmpeg详细安装教程,亲测有效!
- 对PBFT算法的理解
- 二工大计算机专业,二工大 上海第二工业大学 计算机专业英语 期末考试
- 论文笔记 | 用户画像
- 致远OA 组合getshell
- 如何使用git 生成密钥?
- 数字签名技术及加密算法
- 解决电脑C盘空间不足,发现微信和qq文件占用了大量内存
- 老板,我们的网站又挂了——漫谈 DDoS 攻击
- linux各种配置笔记
- 视频号6个涨粉方法,运营小技巧
- 磊科路由破解登入密码的办法
- 平安证券股票交易接口异常怎么解决?
- 【CSS】行高、边框、外边距、内边距