1. 代理设计模式概念

  两个子类共同实现一个接口,其中一个子类负责真实业务实现,另外一个子类辅助真实业务的完成。就像战场上的狙击手都配有一名观察员,狙击手负责狙杀敌人,观察员负责辅助狙击手完成任务,两人都是为了狙杀敌人这个任务而生。

  代理设计模式一般都与工厂设计模式相配合使用,对于工厂设计模式还有疑惑的可以参考:

Java 反射3-简单工厂模式

// 业务接口
interface ISubject {public void eat();
}// 真实业务类,吃饭
class RealSubject implements ISubject {@Overridepublic void eat() {System.out.println("吃饭");}
}// 代理类,我们将吃饭前的洗手,吃饭后的洗碗与吃饭这件事加在一起才能构成吃饭的完整过程
class ProxySubject implements ISubject {private ISubject iSubject = null;// 通过构造方法将真实业务传进来public ProxySubject(ISubject iSubject) {this.iSubject = iSubject;}// 辅助业务public void prepareEat() {System.out.println("洗手");}// 辅助业务public void afterEat() {System.out.println("洗碗");}// 真实业务和辅助业务结合在一起的产物,我们需要的就是它@Overridepublic void eat() {this.prepareEat();this.iSubject.eat();this.afterEat();}
}// 通过工厂我们要拿到代理类的对象
class Factory {private Factory() {}public static ISubject getInstance() {ISubject real = new RealSubject();ISubject proxy = new ProxySubject(real);return proxy;}
}public class Test {public static void main(String[] args) throws Exception {ISubject iSubject = Factory.getInstance();iSubject.eat();}
}

  上面的例子将代理设计模式大体框架展示了出来,但是,还有小瑕疵,如果按上面的工厂类设计模式,那么以后不同的业务类我们就得设计不同的工厂类,不是很麻烦吗。接下来,使用反射来解决这个问题。

2. 基础代理模式

  使用反射将工厂类中的内容修改一下即可,修改如下:

class Factory {private Factory() {}// 输入真实业务类全名称,返回真实业务类public static <T> T getInstance(String className) throws Exception {return (T)Class.forName(className).newInstance();}// 输入代理业务类全名称,真实业务类,返回代理业务类public static <T> T getInstance(String className, Object object) throws Exception{Constructor<?> constructor = Class.forName(className).getConstructor(object.getClass().getInterfaces()[0]);return (T)constructor.newInstance(object);}}public class Test {public static void main(String[] args) throws Exception {// version 1ISubject iSubject = Factory.getInstance("class13.ProxySubject", Factory.getInstance("class13.RealSubject"));iSubject.eat();}
}

  虽然使用了反射之后,使客户端的压力骤然减少,可是确让工厂类的代码变得一塌糊涂,我们进一步进行修改。

public static <T> T getInstance(String proxyName, String realName) throws Exception {T real = (T)Class.forName(realName).newInstance();Constructor<?> constructor = Class.forName(proxyName).getConstructor(real.getClass().getInterfaces()[0]);return (T)constructor.newInstance(real);
}

  代理设计模式总体思路如图所示:

Java 反射5-基础代理模式相关推荐

  1. Java 反射6-动态代理模式

    动态代理   动态代理模式的核心特点:一个代理类可以代理所有需要被代理的接口的子类对象,如下所示:   N个接口, N+1个类, 其中 N 个真是业务类,1个代理类(在运行时动态获取当前要代理的接口) ...

  2. Java的三种代理模式完整源码分析

    Java的三种代理模式&完整源码分析 Java的三种代理模式&完整源码分析 参考资料: 博客园-Java的三种代理模式 简书-JDK动态代理-超详细源码分析 [博客园-WeakCach ...

  3. Java的三种代理模式【附源码分析】

    Java的三种代理模式&完整源码分析 代理模式分为两种,静态代理和动态代理,动态代理包括JDK动态代理和Cglib动态代理. 静态代理 静态代理在使用时,需要定义接口或者父类,被代理对象与代理 ...

  4. Java的三种代理模式简述

    本文着重讲述三种代理模式在java代码中如何写出,为保证文章的针对性,暂且不讨论底层实现原理,具体的原理将在下一篇博文中讲述. 代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下, ...

  5. throwable四参构造_深入分析Java反射(四)-动态代理

    动态代理的简介 Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分 ...

  6. 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理

    这篇博文,我们主要以类图和代码的形式来对照学习一下静态代理和动态代理.重点解析各自的优缺点. 定义 代理模式(Proxy Pattern)是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并 ...

  7. Java拾遗:007 - 代理模式与动态代理

    2019独角兽企业重金招聘Python工程师标准>>> 代理模式 在日常开发中我们可以会接手一些老的项目,有时连源码都没有,或者有时候我会需要对业务逻辑做一定增强(功能扩展,如:日志 ...

  8. java的三种代理模式

    2019独角兽企业重金招聘Python工程师标准>>> 1.代理模式很好地将两个直接关联的类进行了解耦,并且还可以在代理类中添加额外的代码,以进行特殊的处理,如果不采用代理模式,当两 ...

  9. 23种java设计模式详解-代理模式

    什么是代理模式: Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问.所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类, ...

最新文章

  1. laydate兼容bootstrap
  2. 企业项目开发--切分配置文件
  3. MFC对话框绘制灰度直方图
  4. jemeter python接口自动化测试平台_WEB接口开发与自动化测试基于PYTHON语言PDF_Python教程...
  5. 电子商务专业实习总结
  6. 安装CentOS7虚拟机
  7. HTML的段落与注释元素
  8. java搭建rtmp服务器,利用docker搭建RTMP直播流服务器实现直播
  9. linux 虚拟ip 漂移,keepalived 虚拟ip切换
  10. python人狗大战游戏_6.5 人狗大战.py
  11. ios label 高度紫石英_iOS_NSMutableAttributedString和自适应宽度高度
  12. 记录阿里云增加二级域名步骤[同三级]
  13. 记一次简单爬虫(豆瓣/dytt)
  14. 前端js正则验证大全(一套完整的正则验证解决方案)@莫成尘
  15. 文献笔记:Contrast-Phys: Unsupervised Video-based Remote Physiological Measurement viaSpatiotemporal Con
  16. 求最大公因数的两种方法(高效方法)
  17. 再见2018 你好2019
  18. Java程序员必会!java语言的编译命令是什么
  19. MAVEN依赖jar版本下载错误:xxx.pom.part.lock (文件名、目录名或卷标语法不正确。)
  20. lower_bound,upper_bound的第四个参数

热门文章

  1. innerText textContent innerHTML
  2. 计算机音乐谱大全往后余生,往后余生歌曲简谱抖音神曲在线欣赏
  3. poi(1)---概述
  4. 谁看了日本LINE的聊天记录
  5. 安卓开发——样式,主题
  6. springboot+netty实现网络聊天
  7. 解决:“cxfreeze”无法运行,没有应用程序与此操作的指定文件有关联。
  8. 为什么我强烈建议大家使用 Linux 开发?
  9. 树与树算法二叉树的层次遍历/广度遍历/深度遍历详解与代码实现
  10. AOP方式捕获和处理微信小程序前端全局异常