代理模式定义:为其他对象提供了一种代理以控制对这个对象的访问。

代理模式的三种角色:

  Subject抽象主题角色:抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求。

  RealSubject具体主题角色:也叫做被委托角色、被代理角色。它才是冤大头,是业务逻辑的具体执行者,Subject接口的实现。

  Proxy代理主题角色:也叫做委托类、代理类。它负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前做预处理和善后工作。

一句话描述静态代理和动态代理:

  静态代理:一个主题类与一个代理类一一对应。

  动态代理:多个主题类对应一个代理类。

静态代理的例子:

Subject接口:

package com.design.one;
public interface Subject {void doSomething();
}

RealSubject类:

package com.design.one;
public class RealSubject implements Subject{@Overridepublic void doSomething() {System.out.println("doSomething()......");}
} 

Proxy类:

package com.design.one;
public class Proxy implements Subject{Subject subject = null;public Proxy(Subject subject) {this.subject = subject;}@Overridepublic void doSomething() {System.out.println("之前");subject.doSomething();System.out.println("之后");}
}

Client类:

package com.design.one;
public class Client {public static void main(String[] args) {Subject sub = new RealSubject();Proxy proxy = new Proxy(sub);proxy.doSomething();}
}

输出结果:

  之前
  doSomething()......
  之后

动态代理的例子:

引子:一般来说,使用静态代理,都需要每一个RealSubject编写一一对应的代理类,这些类在编译期间就已经确定了的,如果有多个RealSubject类,但是他们的代理类里面的前处理(“之前”)和后处理(“之后”)是一样的,那么使用静态代理模式为多个RealSubject类编写相同的处理逻辑的代理类就显得臃肿了和多余了。而动态代理不同,它能使多个RealSubject类对应一个代理类,共享“前处理,后处理”功能,动态调用所需主题,大大减小了程序规模。

Subject类:

package com.design.three;
public interface Subject {void doSomething();void doSomething1();
} 

Subject2类:

package com.design.three;
public interface Subject2 {void doSomething3();void doSomething4();
} 

RealSubject类:

package com.design.three;
public class RealSubject implements Subject,Subject2{@Overridepublic void doSomething() {System.out.println("doSomething()......");}@Overridepublic void doSomething1() {System.out.println("doSomething()1......");  }@Overridepublic void doSomething3() {System.out.println("doSomething()3......");}@Overridepublic void doSomething4() {System.out.println("doSomething()4......");}
} 

RealSubject2类:

package com.design.three;
public class RealSubject2 implements Subject,Subject2{@Overridepublic void doSomething() {System.out.println("Subject2doSomething()......");}@Overridepublic void doSomething1() {System.out.println("Subject2doSomething()1......");   }@Overridepublic void doSomething3() {System.out.println("Subject2doSomething()3......");}@Overridepublic void doSomething4() {System.out.println("Subject2doSomething()4......");}
}

MyInvocationHandler类:

package com.design.three;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler{private Object obj = null;public MyInvocationHandler(Object obj) {this.obj = obj;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("方法前....");return method.invoke(obj, args);}
}

Client类:

package com.design.three;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Client {public static void main(String[] args) {Subject sub = new RealSubject();//1// Subject sub = new RealSubject2();//2InvocationHandler handler = new MyInvocationHandler(sub);Subject proxy = (Subject) Proxy.newProxyInstance(sub.getClass().getClassLoader(), sub.getClass().getInterfaces(), handler);proxy.doSomething();}
}

输出结果:

方法前....
doSomething()......

把2注释打开,1注释掉,输出结果:

方法前....
Subject2doSomething()......

接下来是四篇个人认为比较好的学习动态代理的文章,具体原理和分析都在下面了,我就不再累赘了:

Java帝国之动态代理

动态代理和静态代理到底有什么区别,好处在哪里?

JDK动态代理实现原理

Java设计模式——代理模式实现及原理

转载于:https://www.cnblogs.com/tongkey/p/8596697.html

Java中的代理模式--静态代理和动态代理相关推荐

  1. 谈谈java代理模式的认识二——动态代理(JDK)

    让我们就接着上篇博客的静态代理来开始今天的动态代理. 一.动态代理 静态代理需要在运行之前就写好代理类,这样就造成了代码的大量重复,所以我们通过动态代理在运行时期动态生成业务类的代理类,那么动态代理类 ...

  2. 动态代理的分析以及利用动态代理模式进行敏感词汇过滤

    动态代理 增强对象的功能: 设计模式:一些通用的解决固定问题的方式 代理模式 概念: (1). 真实对象:被代理的对象 (2). 代理对象: (3). 代理模式:代理对象代理真实对象,达到增强真实对象 ...

  3. 第六周 Java语法总结_设计原则_工厂模式_单例模式_代理模式(静态代理_动态代理)_递归_IO流_网络编程(UDP_TCP)_反射_数据库

    文章目录 20.设计原则 1.工厂模式 2.单例模式 1)饿汉式 2)懒汉式 3.Runtime类 4.代理模式 1)静态代理 2)动态代理 动态代理模板 21.递归 22.IO流 1.File 2. ...

  4. Java代理模式——静态代理动态代理

    proxy mode 1. 什么是代理 1.1 例子解释 1.2 作用 2. 静态代理 2.1 优缺点分析 2.2 以厂家卖u盘用代码说明 3. 动态代理 3.1 什么是动态代理 3.2 jdk实现原 ...

  5. 【Android 插件化】Hook 插件化框架 ( Hook 技术 | 代理模式 | 静态代理 | 动态代理 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  6. 代理模式——静态代理,动态代理(JDK代理和CGLib代理)

    概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问. 这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. Java中的代理按照代理类生成时机不同又分为 ...

  7. 什么是代理模式?代理模式有什么用?通过一个小程序分析静态代理和动态代理。自己简单实现动态代理。JDK动态代理和CGLIB动态代理的区别。

    1. 代理模式有什么用 ①功能增强,在实现目标功能的基础上,又增加了额外功能.就像生活中的中介一样,他跟两边客户会有私下的交流. ②控制访问,代理不让用户直接和目标接触.就像中间商一样,他们不会让我们 ...

  8. Android代理模式(静态代理,动态代理,Retrofit代理模式分析)

    文章目录 代理模式 前言:AOP编程(面向切面编程) 一. 代理思想 1. 静态代理 2. 动态代理 3. 动态代理的实现 二. Retrofit代理模式分析 代理模式 前言:AOP编程(面向切面编程 ...

  9. 代理模式 静态代理、JDK动态代理、Cglib动态代理

    1 代理模式 使用代理模式时必须让代理类和被代理类实现相同的接口: 客户端通过代理类对象来调用被代理对象方法时,代理类对象会将所有方法的调用分派到被代理对象上进行反射执行: 在分派的过程中还可以添加前 ...

  10. [设计模式] - 代理模式(静态代理与动态代理)

    文章目录 一.代理模式简介 1. 什么是代理模式 2. 简单举例 二.代理模式的设计思路 1. 代理模式的构成 1. 静态代理 2. 动态代理 (1)接口代理 (2)Cglib代理 三. 代理模式总结 ...

最新文章

  1. 找回MySQL的root密码
  2. Linux下Tomcat重新启动以及日志
  3. python替代_【Python】选择ipython替代python的理由
  4. SAP Spartacus加载delivery国家列表的处理逻辑
  5. apache网站访问需要密码设置步骤总结
  6. PopTip View
  7. 根据MIDlet套件(Jar文件)自动生成jad文件
  8. md5 java_JAVA使用MD5加密解密
  9. 照片怎么加水印,照片加水印操作步骤
  10. Mysql基础命令语句(1)
  11. mysql 50个经典语句_MYSQL经典语句大全——技巧篇
  12. 转载:关于调制比、过调制、基波电压和母线电压的概念和关系总结
  13. 笔记:[windows] 简单写一个cmd命令行可执行的脚本.bat
  14. python使用pandas打不开excel文件
  15. 教育技术学是计算机相关资料,教育技术学专业
  16. 解决windows10 桌面拖动文件到微信后无反应问题,尝试记录
  17. 6. 中文命名实体提取
  18. 杭电ACM-LCY算法进阶培训班-专题训练(KMP)
  19. 怎么做副业越做越好?看钟汉良抱大腿白皮书
  20. 添加全部文件夹到vss服务器

热门文章

  1. 融合7大领域!Apache Flink 在开源生态下的应用实践
  2. React目录结构详细解析
  3. 为什么像王者荣耀这样的游戏Server不愿意使用微服务?
  4. 得意时别嘚瑟,失意时别灰心
  5. Android Multimedia框架总结(十九)Camera2框架C/S模型之CameraService启动及与Client连接过程
  6. java虚拟机内存存储一个对象_java虚拟机在java堆中对象内存分配、布局、访问
  7. kitti数据集_CVPR2020 | PV-RCNN: 3D目标检测 Waymo挑战赛+KITTI榜 单模态第一算法
  8. 威海二职工业机器人专业_工业机器人专业主要学什么?
  9. cxgrid 行合并单元格_Excel合并单元格无法筛选和排序,你必须掌握这3个小技巧...
  10. 帆软高级函数应用之层次坐标函数