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();}
}

运行结果:

我记录一下启动校验前的相关日志
我开启了某项校验~~
我记录一下启动校验后的相关日志。

静态代理模式相对比较简单,但是缺点肯定也是有的:

  1. 一个代理对象只能服务于一个类。如果有很多类需要记录日志的话,你的一个一个去实现。。累不死你。。

  2. 代理对象必须实现接口,如上。一个字:还是累。

动态代理

这里动态代理使用的是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动态代理相关推荐

  1. 两万字吐血总结,代理模式及手写实现动态代理(aop原理,基于jdk动态代理)

    代理模式及手写实现动态代理 一.代理模式 1. 定义 2. 示例 (1)静态代理 (2)动态代理 3. 通用类图 4. 代理模式的优点 二.jdk动态代理实现原理 1. jdk动态代理源码分析(通过该 ...

  2. java中的静态、动态代理模式以及Spring中的CgLib动态代理解读(面试必问)

    java中的静态.动态代理模式以及Spring中的CgLib动态代理解读(面试必问) 静态代理 动态代理 CgLib动态代理     基础知: 反射知识 代理(Proxy)是一种设计模式,提供了对目标 ...

  3. java代理(静态代理和jdk动态代理以及cglib代理)

    说到代理,脑袋中浮现一大堆代理相关的名词,代理模式,静态代理,jdk代理,cglib代理等等. 记忆特别深刻的是,一次面试中,一位面试官问我,spring的AOP核心采用的设计模式是什么什么模式,阅读 ...

  4. 静态代理和JDK动态代理

    (开发环境是MyEclipse) 静态代理示例 HellowStaticProxy代理, HellowObject被代理 HellowObject和HellowStaticProxy实现iHellow ...

  5. java静态代理和JDK动态代理

    静态代理 编译阶段就生产了对应的代理类 public interface IBussiness {void execute(); } public class BussinessImpl implem ...

  6. 设计模式之代理模式(静态代理动态代理)

    目录 1.什么是代理模式 2.代理模式的结构 3.代理模式的实现 3.1 静态代理和动态代理概念 3.2 静态代理 3.3 动态搭理 3.3.1 代码实现 3.3.2 Proxy类讲解 4.动态代理V ...

  7. 【Java】代理模式(静态代理动态代理)

    CONTENT 代理模式 静态代理 动态代理 JDK 动态代理(基于接口) CGLIB 动态代理(基于类继承) JDK 动态代理 v.s. CGLIB 动态代理 JDK 动态代理为什么必须基于接口 R ...

  8. 代理模式 :静态代理 +动态代理(jdk实现+cglib实现)

    昨天被人问及动态代理与CGlib的区别,赶紧回顾一下: 什么是代理? 静态代理与动态代理 静态代理实例 JDK动态代理实例 CGLib 简介 CGLib 与JDK动态代理的区别 代理模式是Java中常 ...

  9. 代理模式(静态、动态)

    文章目录 一.代理模式 1.什么是代理模式 2.为什么使用代理模式 3.代理模式应用场景 4..代理模式实现原理 5.代理模式创建的方式 6.静态代理 6.1基于接口方式 6.1基于继承方式 7.动态 ...

最新文章

  1. 手机拍视频最怕抖,只能靠AI拯救了
  2. linux_软件安装策略和升级策略
  3. Spring 事务管理高级应用难点剖析--转
  4. 区块链比特币开源_开源资金:比特币,区块链和免费软件
  5. lintcode:最大子正方形
  6. Django进阶之CSRF
  7. ffmpeg详细安装教程,亲测有效!
  8. 对PBFT算法的理解
  9. 二工大计算机专业,二工大 上海第二工业大学 计算机专业英语 期末考试
  10. 论文笔记 | 用户画像
  11. 致远OA 组合getshell
  12. 如何使用git 生成密钥?
  13. 数字签名技术及加密算法
  14. 解决电脑C盘空间不足,发现微信和qq文件占用了大量内存
  15. 老板,我们的网站又挂了——漫谈 DDoS 攻击
  16. linux各种配置笔记
  17. 视频号6个涨粉方法,运营小技巧
  18. 磊科路由破解登入密码的办法
  19. 平安证券股票交易接口异常怎么解决?
  20. 【CSS】行高、边框、外边距、内边距

热门文章

  1. MySQL二级比office二级_如何快速拿到计算机office二级
  2. flex如何做响应式设计_响应式设计-您做错了!
  3. 1-jdk的安装与配置
  4. 大数据小白系列——HDFS(1)
  5. 苏宁易购:Hadoop失宠前提是出现更强替代品
  6. jhope代码分析以及网站结构
  7. AppDomainManager后门的实现思路
  8. Gradle 1.12用户指南翻译——第五十四章. 构建原生二进制文件
  9. lecture6-mini批量梯度训练及三个加速的方法
  10. axure文本框值相加_Axure教程:计数文本域实现