一、代理模式分为静态代理和动态代理

 代理模式分为静态代理模式和静态代理模式,相对于静态代理模式,动态代理模式理解起来更加抽象。

二、想要了解动态代理模式首先要了解动态代理类

Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:
1、Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method,Object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数组。这个抽象方法在代理类中动态实现。
2、Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject,其中主要包含以下内容: Protected Proxy(InvocationHandler h):构造函数,估计用于给内部的h赋值。 Static Class getProxyClass (ClassLoader loader,Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。 Static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)。 所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。 在使用动态代理类时,我们必须实现InvocationHandler接口,以第一节中的示例为例: 抽象角色(之前是抽象类,此处应改为接口): public interface Subject { abstract public void request(); } 具体角色RealSubject:同上;
3、代理机制及特点 通过实现 InvocationHandler 接口创建自己的调用处理器; 通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类; 通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型; 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。

三、动态代理的适用场景

  1. AOP—面向切面编程,程序解耦
    简言之当你想要对一些类的内部的一些方法,在执行前和执行后做一些共同的的操作,而在方法中执行个性化操作的时候–用动态代理。在业务量庞大的时候能够降低代码量,增强可维护性。

  2. 想要自定义第三放类库中的某些方法
    我引用了一个第三方类库,但他的一些方法不满足我的需求,我想自己重写一下那几个方法,或在方法前后加一些特殊的操作–用动态代理。但需要注意的是,这些方法有局限性,我会在稍后说明。

四、动态代理的实现


1、创建Subject接口

public interface Subject {public void doSomething();
}

2、创建Subject的真实实现类RealSubject

public class RealSubject implements Subject {@Overridepublic void doSomething() {// TODO Auto-generated method stubSystem.out.println( "call doSomething()" ); }}

3、创建代理类ProxyHandler实现InvocationHandler

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;public class ProxyHandler implements InvocationHandler {private Object proxied;public ProxyHandler(Object proxied) {// TODO Auto-generated constructor stubthis.proxied=proxied;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("我是王明远,程序开始了");      return method.invoke( proxied, args); }}

4、创建测试类Test

import java.lang.reflect.Proxy;
import com.yuan.dao.Subject;
import com.yuan.impl.ProxyHandler;
import com.yuan.impl.RealSubject;public class Test {public static void main(String[] args) {RealSubject real = new RealSubject(); //两种创建代理类对象的方式//  Subject proxySubject = (Subject)Proxy.newProxyInstance(Subject.class.getClassLoader(),  real.getClass().getInterfaces(), new ProxyHandler(real));Subject proxySubject = (Subject)Proxy.newProxyInstance(Subject.class.getClassLoader(),  new Class[]{Subject.class}, new ProxyHandler(real));proxySubject.doSomething();}
}

ok,这样就实现了简单动态代理模式。 动态代理模式通过使用反射,可以在运行期决定加载哪个类,避免了一个类对应一个代理的问题;同时,通过统一的invoke方法,统一了代理类对原函数的处理过程,使用动态代理很大程度上减少了重复的代码,降低了维护的复杂性和成本。

设计模式之动态代理模式相关推荐

  1. 设计模式之动态代理模式实战

    昨天分享了静态代理的概念及存在的缺点,所以今天讲的动态代理模式十分重要.动态代理在我们工作当中应用相当广泛,如Srping AOP就是动态代理的在开源框架的比较出名的应用. 动态代理有两种试,一是通过 ...

  2. Android开发中无处不在的设计模式——动态代理模式

    继续更新设计模式系列.写这个模式的主要原因是近期看到了动态代理的代码. 先来回想一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式-- ...

  3. 设计模式之代理模式、动态代理模式、Cglib代理模式

    代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用到编程中的 ...

  4. 【设计模式】--- 装饰器模式、静态代理模式和动态代理模式

    文章目录 1 引子 2 业务场景介绍 3 静态代理模式 4 装饰器模式 5 动态代理模式 5.1 Proxy --- 具体的代理对象生成组件 5.2 InvocationHandler --- 封装被 ...

  5. 设计模式之----Java动态代理模式

    在Spring中,有很多设计模式被应用,其中不乏代理模式.而代码模式中,就一定少不了动态代理模式.今天就对动态代理模式进行学习记录. 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托 ...

  6. 研磨23种大话设计模式------动态代理模式 + 小结静态代理模式

    大家好,我是一位在java学习圈中不愿意透露姓名并苟且偷生的小学员,如果文章有错误之处,还望海涵,欢迎多多指正 如果你从本文 get 到有用的干货知识,请帮忙点个赞呗,据说点赞的都拿到了offer 在 ...

  7. Java设计模式之JDK动态代理模式

    先来谈谈什么动态代理模式,在一家软件公司,假如你是一个软件开发工程师.当客户带着需求去找公司的时候,显然不会直接让你和客户谈,肯定是先和商务经理,产品经理类的谈需求.因为客户的需求可能千奇百怪,很有可 ...

  8. 软件设计模式 | 动态代理模式

    文章目录 一.动态代理概述 1.1 代理的概述和作用 1.2 动态代理的优点 1.3 代理对象的创建 1.4 代理对象调用方法的执行流程 二.动态代理举例 2.1 歌手经纪人 2.2 业务功能的性能统 ...

  9. java设计模式--工厂模式、静态代理模式、动态代理模式

    工厂模式 代码实现: 步骤一:创建一个接口 Car.java package FactoryMode;public interface Car {public void run(); } 步骤二:创建 ...

最新文章

  1. 【AI】CelebA数据介绍、下载及说明
  2. tsne pca 自编码器 绘图(CC2)——一定记得做无量纲化处理使用standardscaler,数据聚类更明显...
  3. 微众WeCross 跨链平台(5)“UBI通用区块链接口”设计
  4. 服务器采购项目技术方案,小型机服务器采购项目技术方案.doc
  5. jQuery表单对象属性过滤选择器
  6. 问题:HikariPool-1 - Shutdown initiated...的解决
  7. Python中的相对文件路径的调用
  8. 机器学习 —— 基础整理(二)朴素贝叶斯分类器;文本分类的方法杂谈
  9. flask v0.1 内部运行程序
  10. STM32工作笔记0078---UCOSIII任务挂起和恢复
  11. QT中文乱码的解决方法,一劳永股的解决方法,如下
  12. 【Dart学习】--Dart之正则表达式相关方法总结
  13. javascript面试题(一)
  14. LaTeX 引用表格、照片、公式的时候自动添加 table,fig,equ
  15. CSS属性—居中对齐篇
  16. ctfmon是什么启动项_开机启动项命令是什么-百度经验
  17. Spring boot与Spring cloud
  18. python计算三角形的周长和面积
  19. Java算法:LeetCode算法Java版合集1111-1588题
  20. bbr29_TCP BBR导致性能下降

热门文章

  1. word中插入带入带有上标和下标的字符串
  2. 网络质量指标及测试工具iperf
  3. LaTex表格 Itemizeenumerate
  4. bzoj4976宝石镶嵌 DP
  5. lintcode 1228. 可怜的猪 思考题
  6. 微图App中如何切换普通标注和专业标注
  7. Java技术——Java泛型详解
  8. 【MATLAB appdesigner】20_UIAxes中绘图以及操作汇总(良心总结,值得收藏)
  9. 正月初二 祭财神 [春节习俗]
  10. 【无限互联】学员作品:优顾理财ios客户端