Java中的代理模式--静态代理和动态代理
代理模式定义:为其他对象提供了一种代理以控制对这个对象的访问。
代理模式的三种角色:
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中的代理模式--静态代理和动态代理相关推荐
- 谈谈java代理模式的认识二——动态代理(JDK)
让我们就接着上篇博客的静态代理来开始今天的动态代理. 一.动态代理 静态代理需要在运行之前就写好代理类,这样就造成了代码的大量重复,所以我们通过动态代理在运行时期动态生成业务类的代理类,那么动态代理类 ...
- 动态代理的分析以及利用动态代理模式进行敏感词汇过滤
动态代理 增强对象的功能: 设计模式:一些通用的解决固定问题的方式 代理模式 概念: (1). 真实对象:被代理的对象 (2). 代理对象: (3). 代理模式:代理对象代理真实对象,达到增强真实对象 ...
- 第六周 Java语法总结_设计原则_工厂模式_单例模式_代理模式(静态代理_动态代理)_递归_IO流_网络编程(UDP_TCP)_反射_数据库
文章目录 20.设计原则 1.工厂模式 2.单例模式 1)饿汉式 2)懒汉式 3.Runtime类 4.代理模式 1)静态代理 2)动态代理 动态代理模板 21.递归 22.IO流 1.File 2. ...
- Java代理模式——静态代理动态代理
proxy mode 1. 什么是代理 1.1 例子解释 1.2 作用 2. 静态代理 2.1 优缺点分析 2.2 以厂家卖u盘用代码说明 3. 动态代理 3.1 什么是动态代理 3.2 jdk实现原 ...
- 【Android 插件化】Hook 插件化框架 ( Hook 技术 | 代理模式 | 静态代理 | 动态代理 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 代理模式——静态代理,动态代理(JDK代理和CGLib代理)
概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问. 这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. Java中的代理按照代理类生成时机不同又分为 ...
- 什么是代理模式?代理模式有什么用?通过一个小程序分析静态代理和动态代理。自己简单实现动态代理。JDK动态代理和CGLIB动态代理的区别。
1. 代理模式有什么用 ①功能增强,在实现目标功能的基础上,又增加了额外功能.就像生活中的中介一样,他跟两边客户会有私下的交流. ②控制访问,代理不让用户直接和目标接触.就像中间商一样,他们不会让我们 ...
- Android代理模式(静态代理,动态代理,Retrofit代理模式分析)
文章目录 代理模式 前言:AOP编程(面向切面编程) 一. 代理思想 1. 静态代理 2. 动态代理 3. 动态代理的实现 二. Retrofit代理模式分析 代理模式 前言:AOP编程(面向切面编程 ...
- 代理模式 静态代理、JDK动态代理、Cglib动态代理
1 代理模式 使用代理模式时必须让代理类和被代理类实现相同的接口: 客户端通过代理类对象来调用被代理对象方法时,代理类对象会将所有方法的调用分派到被代理对象上进行反射执行: 在分派的过程中还可以添加前 ...
- [设计模式] - 代理模式(静态代理与动态代理)
文章目录 一.代理模式简介 1. 什么是代理模式 2. 简单举例 二.代理模式的设计思路 1. 代理模式的构成 1. 静态代理 2. 动态代理 (1)接口代理 (2)Cglib代理 三. 代理模式总结 ...
最新文章
- 找回MySQL的root密码
- Linux下Tomcat重新启动以及日志
- python替代_【Python】选择ipython替代python的理由
- SAP Spartacus加载delivery国家列表的处理逻辑
- apache网站访问需要密码设置步骤总结
- PopTip View
- 根据MIDlet套件(Jar文件)自动生成jad文件
- md5 java_JAVA使用MD5加密解密
- 照片怎么加水印,照片加水印操作步骤
- Mysql基础命令语句(1)
- mysql 50个经典语句_MYSQL经典语句大全——技巧篇
- 转载:关于调制比、过调制、基波电压和母线电压的概念和关系总结
- 笔记:[windows] 简单写一个cmd命令行可执行的脚本.bat
- python使用pandas打不开excel文件
- 教育技术学是计算机相关资料,教育技术学专业
- 解决windows10 桌面拖动文件到微信后无反应问题,尝试记录
- 6. 中文命名实体提取
- 杭电ACM-LCY算法进阶培训班-专题训练(KMP)
- 怎么做副业越做越好?看钟汉良抱大腿白皮书
- 添加全部文件夹到vss服务器
热门文章
- 融合7大领域!Apache Flink 在开源生态下的应用实践
- React目录结构详细解析
- 为什么像王者荣耀这样的游戏Server不愿意使用微服务?
- 得意时别嘚瑟,失意时别灰心
- Android Multimedia框架总结(十九)Camera2框架C/S模型之CameraService启动及与Client连接过程
- java虚拟机内存存储一个对象_java虚拟机在java堆中对象内存分配、布局、访问
- kitti数据集_CVPR2020 | PV-RCNN: 3D目标检测 Waymo挑战赛+KITTI榜 单模态第一算法
- 威海二职工业机器人专业_工业机器人专业主要学什么?
- cxgrid 行合并单元格_Excel合并单元格无法筛选和排序,你必须掌握这3个小技巧...
- 帆软高级函数应用之层次坐标函数