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{
@Override
public 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;
}
@Override
public 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{ @Override
public void doSomething() {
System.out.println("doSomething()......");
}
@Override
public void doSomething1() {
System.out.println("doSomething()1......");
}
@Override
public void doSomething3() {
System.out.println("doSomething()3......");
}
@Override
public void doSomething4() {
System.out.println("doSomething()4......");
}
}
RealSubject2类:
package com.design.three;
public class RealSubject2 implements Subject,Subject2{
@Override
public void doSomething() {
System.out.println("Subject2doSomething()......");
}
@Override
public void doSomething1() {
System.out.println("Subject2doSomething()1......");
}
@Override
public void doSomething3() {
System.out.println("Subject2doSomething()3......");
}
@Override
public 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;
}
@Override
public 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();//2
InvocationHandler handler = new MyInvocationHandler(sub);
Subject proxy = (Subject) Proxy.newProxyInstance(sub.getClass()
.getClassLoader(), sub.getClass().getInterfaces(), handler);
proxy.doSomething();
}
}
输出结果:
方法前....
doSomething()......
把2注释打开,1注释掉,输出结果:
方法前....
Subject2doSomething()......
接下来是四篇个人认为比较好的学习动态代理的文章,具体原理和分析都在下面了,我就不再累赘了:
Java中的代理模式--静态代理和动态代理本质理解的更多相关文章
- 代理模式(Proxy)--动态代理(CGLIB)
上一篇:代理模式(Proxy)--动态代理(jdk) (1)CGLIB技术是第三方代理技术,可以对任何类生成代理,代理的原则是对目标对象进行继承代理 (2)如果目标对象被final修饰,则无法被CGL ...
- 代理模式(Proxy)--动态代理(JDK)
在是上一篇博客中实现了静态代理. 在上篇的结尾提到了一个问题: 思考:如果我们下需要对火车,自行车实现相同的代理,我们又该如何实现呢? 这篇博客就来解决这个问题: 解决这类问题需要用到动态代理技术,实 ...
- 【Java】代理模式、反射机制-动态代理
关于代理模式和动态代理参考自:https://www.cnblogs.com/gonjan-blog/p/6685611.html 这里通过参考博客中的例子整理个人理解. 代理模式: 访问某个类的方法 ...
- Java 代理模式 (二) 动态代理
代理模式 代理(Proxy)是一种设计模式, 提供了对目标对象另外的访问方式:即通过代理访问目标对象. 这样好处: 可以在目标对象实现的基础上,增强额外的功能操作.(扩展目标对象的功能). 代理模式的 ...
- java 代理模式-静态代理与动态代理
最近在研究SpringAOP,当然要学习AOP就要知道这么健硕.强大的功能的背后究竟隐藏着怎样不可告人的“秘密”?? 接下来就是查阅了许多资料详细的研究了一下Java的代理模式,感觉还是非常非常重要的 ...
- 【Java】代处理?代理模式 - 静态代理,动态代理
>不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算, ...
- java 设计模式之单利模式以及代理模式(静态)
1:单利模式: public class Singleton { private static Singleton uniqueInstance = null; private Singleton() ...
- 代理模式(静态代理、JDK动态代理原理分析、CGLIB动态代理)
代理模式 代理模式是设计模式之一,为一个对象提供一个替身或者占位符以控制对这个对象的访问,它给目标对象提供一个代理对象,由代理对象控制对目标对象的访问. 那么为什么要使用代理模式呢? 1.隔离,客户端 ...
- 代理模式 静态代理、JDK动态代理、Cglib动态代理
1 代理模式 使用代理模式时必须让代理类和被代理类实现相同的接口: 客户端通过代理类对象来调用被代理对象方法时,代理类对象会将所有方法的调用分派到被代理对象上进行反射执行: 在分派的过程中还可以添加前 ...
- 动态代理的两种方式,以及区别(静态代理、JDK与CGLIB动态代理、AOP+IoC)
Spring学习总结(二)——静态代理.JDK与CGLIB动态代理.AOP+IoC 目录 一.为什么需要代理模式 二.静态代理 三.动态代理,使用JDK内置的Proxy实现 四.动态代理,使用cg ...
随机推荐
- hbase优化之region合并和压缩
HBASE操作:(一般先合并region然后再压缩) 一 .Region合并: merge_region 'regionname1','regionname2' ,'true' --true代表 ...
- hiho第151周 Building in Sandbox floodfill
题意:题目背景是<<我的世界>>,堆方块造房子,堆的规则是:新堆的方块必须和已有方块有重合面,而且不能往封闭空间里堆. 在三维空间中,给定一个堆的序列,判断符不符合规则. 数据 ...
- 2017第八届蓝桥杯 K倍区间
标题: k倍区间 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...
- HDU - 1789 贪心
贪心策略:按照分数降序排列,如果分数相同将截止时间早的排在前面.每次让作业尽量晚完成,因此需要逆序枚举判断这一天是否已经做了其他作业,如果没时间做这个作业说明不能完成,否则将这一天标记. AC代码 # ...
- 使用flask_sqlalchemy
首先引用一下廖雪峰Python教程里关于sqlalchemy的话, 这里我们要讲的是flask_sqlalchemy的用法. 1. 安装 用pip安装即可, 进入cmd控制台输入 pip instal ...
- shell脚本——mysql
很期待,学习shell脚本,减少重复工作 自动安装配置mysql脚本: #/bin/bash LOG_FILE=/home/hadoop1/log/installmysql.log function ...
- JavaScript递归原理
JavaScript递归是除了闭包以外,函数的又一特色呢.很多开发新手都很难理解递归的原理,我在此总结出自己对递归的理解. 所谓递归,可以这样理解,就是一个函数在自身的局部环境里通过自身函数名又调用, ...
- vue项目中对axios的二次封装
近来在使用vue重构公司m站时,使用了axios来进行数据的请求,由于项目的需要,对axios进行了二次封装,点击进入axios //引入axios import axios from 'axios' ...
- HighCharts之2D条状图
HighCharts之2D条状图 1.HighCharts之2D条状图源码 bar.html: <!DOCTYPE html> <html> <head> < ...
- 从1.5K到18K,一个程序员的5年成长之路
原文地址:点击打开链接 168楼朋友批评的很有道理, 虚心接受. 我自己是开始学的时候已经错过了基础课的学习, 现在也是深受其苦的, 面临技术上的瓶颈, 需要花更多的时间补充这些知识. 希望看到此文的 ...