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

代理模式的三种角色:

  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帝国之动态代理

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

JDK动态代理实现原理

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

Java中的代理模式--静态代理和动态代理本质理解的更多相关文章

  1. 代理模式(Proxy)--动态代理(CGLIB)

    上一篇:代理模式(Proxy)--动态代理(jdk) (1)CGLIB技术是第三方代理技术,可以对任何类生成代理,代理的原则是对目标对象进行继承代理 (2)如果目标对象被final修饰,则无法被CGL ...

  2. 代理模式(Proxy)--动态代理(JDK)

    在是上一篇博客中实现了静态代理. 在上篇的结尾提到了一个问题: 思考:如果我们下需要对火车,自行车实现相同的代理,我们又该如何实现呢? 这篇博客就来解决这个问题: 解决这类问题需要用到动态代理技术,实 ...

  3. 【Java】代理模式、反射机制-动态代理

    关于代理模式和动态代理参考自:https://www.cnblogs.com/gonjan-blog/p/6685611.html 这里通过参考博客中的例子整理个人理解. 代理模式: 访问某个类的方法 ...

  4. Java 代理模式 (二) 动态代理

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

  5. java 代理模式-静态代理与动态代理

    最近在研究SpringAOP,当然要学习AOP就要知道这么健硕.强大的功能的背后究竟隐藏着怎样不可告人的“秘密”?? 接下来就是查阅了许多资料详细的研究了一下Java的代理模式,感觉还是非常非常重要的 ...

  6. 【Java】代处理?代理模式 - 静态代理,动态代理

    >不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算, ...

  7. java 设计模式之单利模式以及代理模式(静态)

    1:单利模式: public class Singleton { private static Singleton uniqueInstance = null; private Singleton() ...

  8. 代理模式(静态代理、JDK动态代理原理分析、CGLIB动态代理)

    代理模式 代理模式是设计模式之一,为一个对象提供一个替身或者占位符以控制对这个对象的访问,它给目标对象提供一个代理对象,由代理对象控制对目标对象的访问. 那么为什么要使用代理模式呢? 1.隔离,客户端 ...

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

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

  10. 动态代理的两种方式,以及区别(静态代理、JDK与CGLIB动态代理、AOP+IoC)

    Spring学习总结(二)——静态代理.JDK与CGLIB动态代理.AOP+IoC   目录 一.为什么需要代理模式 二.静态代理 三.动态代理,使用JDK内置的Proxy实现 四.动态代理,使用cg ...

随机推荐

  1. 3.3 for 循环

    Python 编程中 for循环用来遍历序列类型的对象,逐一取出序列中的元素值,每取出一个元素值就执行一次循环体,直到元素取完,循环结束.循环体中的代码块可以和序列中的元素值一点关系都没有,因为for ...

  2. spring oauth2 ,spring security整合oauth2.0 JdbcTokenStore实现 解决url-pattern .do .action

    参考以下两个文章: http://www.cnblogs.com/0201zcr/p/5328847.html http://wwwcomy.iteye.com/blog/2230265 web.xm ...

  3. 关于 Java 面试,你应该准备这些知识点

    来源:占小狼, www.jianshu.com/p/1b2f63a45476 马老师说过,员工的离职原因很多,只有两点最真实: 钱,没给到位 心,受委屈了 当然,我是想换个平台,换个方向,想清楚为什么 ...

  4. python更新数据库脚本两种方法

    最近项目的两次版本迭代中,根据业务需求的变化,需要对数据库进行更新,两次分别使用了不同的方式进行更新. 第一种:使用python的MySQLdb模块利用原生的sql语句进行更新 import MySQ ...

  5. Linux基础一

    基本命令 useradd xxx 创建一个用户 uname     查看系统架构信息 uname -a  显示详细信息 uname -r  显示内核信息 date      显示当前网络时间 cat ...

  6. MySQL参数max_connect_errors分析释疑

      最近一MySQL服务器,由于一些特殊因素遇到"ERROR 1129 (00000): Host 'xxx' is blocked because of many connection e ...

  7. ap module omap4460

    http://gitorious.org/ap-module-omap4460 Dashboard Register Login Activities Projects Teams ap module ...

  8. R︱sparkR的安装与使用、函数尝试笔记、一些案例

    本节内容转载于博客: wa2003 spark是一个我迟早要攻克的内容呀~ ------------------------------------- 一.SparkR 1.4.0 的安装及使用 1. ...

  9. sparklyr包:实现Spark与R的接口+sparklyr 0.5

    本文转载于雪晴数据网 相关内容: sparklyr包:实现Spark与R的接口,会用dplyr就能玩Spark Sparklyr与Docker的推荐系统实战 R语言︱H2o深度学习的一些R语言实践-- ...

  10. AFDX总线协议规范

    AFDX总线协议规范 1.概述 2. AFDX简介 3.AFDX的在数据传输性能的改进 3.1 AFDX以太网帧格式 3.2 AFDX以太网冗余备份 3.3 虚拟连接 3.4 数据交换处理 4.航空计 ...