目录:

一、概述

二、静态代理

三、动态代理

四、静态代理和动态代理的区别

一、概述

     代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思。再如我们有的时候打官司,我们需要请律师,因 为律师在法律方面有专长,可以替我们进行操作,表达我们的想法。先来看看关系图:

           

二、静态代理

Sourceable.java

public interface Sourceable{

	public void method();
}

 

Source.java

public class Source implements Sourceable{

	@Override
public void method(){
System.out.println("原生的方法...");
} }

 

Proxy.java

public class Proxy implements Sourceable{

	private Source source;

	public Proxy(){
this.source = new Source();
} @Override
public void method(){ before();
source.method();
after(); } private void after(){
System.out.println("方法执行之前....");
} private void before(){
System.out.println("方法执行之后.....");
} }

测试:

	@Test
public void testProxy(){
Sourceable source = new Proxy();
source.method();
}

结果:

      方法执行之后.....

      原生的方法...

      方法执行之前....

代理模式的应用场景:

如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法:

(1)修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。

(2)就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。

使用代理模式,可以将功能划分的更加清晰,有助于后期维护!

你会发现每个代理类只能为一个接口服务,这样程序开发中必然会产生许多的代理类

所以我们就会想办法可以通过一个代理类完成全部的代理功能,那么我们就需要用动态代理。

三、动态代理

public class InvocationHandlerImpl implements InvocationHandler{

	private Object target;

	public InvocationHandlerImpl(Object target){
this.target = target;
} /*
* proxy: 正在返回的那个代理对象,一般情况下,在invoke方法中都不使用
* method: 正在被调用的方法
* args:调用方法时传入的参数
*/
@Override
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
System.out.println("target : " + target.getClass().getName());
System.out.println("proxy : " + proxy.getClass().getName());
System.out.println("method : " + method.getName());
System.out.println("args : " + args); System.out.println("方法执行之前...");
Object obj = method.invoke(target, args);
System.out.println("方法执行之后..."); return obj;
} }

测试:

	@Test
public void testProxy(){
Sourceable source = new Source(); //获取代理对象
Sourceable sourceProxy = (Sourceable)Proxy.newProxyInstance(
source.getClass().getClassLoader(),
source.getClass().getInterfaces(),
new InvocationHandlerImpl(source)); //通过代理调用方法
sourceProxy.method();
}

结果:

      target : com.kiwi.p3.Source

      proxy : com.sun.proxy.$Proxy4

      method : method

      args : null

      方法执行之前...

      原生的方法...

      方法执行之后...

四、静态代理与动态代理的区别

(1)静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类。 
(2)静态代理事先知道要代理的是什么,而动态代理不知道要代理什么东西,只有在运行时才知道。 
(3)动态代理是实现JDK里的InvocationHandler接口的invoke方法,但注意的是代理的是接口,也就是你的业务类必须要实现接口,通过Proxy里的newProxyInstance得到代理对象。 还有一种动态代理CGLIB,代理的是类,不需要业务类继承接口,通过派生的子类来实现代理。通过在运行时,动态修改字节码达到修改类的目的。

设计模式(三)—代理模式的更多相关文章

  1. 设计模式三: 代理模式(Proxy) -- JDK的实现方式

    简介 代理模式属于行为型模式的一种, 控制对其他对象的访问, 起到中介作用. 代理模式核心角色: 真实角色,代理角色; 按实现方式不同分为静态代理和动态代理两种; 意图 控制对其它对象的访问. 类图 ...

  2. C#设计模式(13)——代理模式(Proxy Pattern)

    一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...

  3. Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景

    我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...

  4. C#设计模式:代理模式(Proxy Pattern)

    一,什么是C#设计模式? 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 二,代码如下: using System; using System.Collectio ...

  5. 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)

    原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...

  6. 8.4 GOF设计模式三: 外观模式 Facade

    GOF设计模式三: 外观模式 Facade  “现有系统”功能强大.复杂,开发“新系统”需要用到其中一部分,但又要增加一部 分新功能,该怎么办?4.1 Facade Pattern: Key Fea ...

  7. 设计模式之代理模式之二(Proxy)

    from://http://www.cnblogs.com/xwdreamer/archive/2012/05/23/2515306.html 设计模式之代理模式之二(Proxy)   0.前言 在前 ...

  8. 夜话JAVA设计模式之代理模式(Proxy)

    代理模式定义:为另一个对象提供一个替身或者占位符以控制对这个对象的访问.---<Head First 设计模式> 代理模式换句话说就是给某一个对象创建一个代理对象,由这个代理对象控制对原对 ...

  9. GOF23设计模式之代理模式

    GOF23设计模式之代理模式 核心作用:通过代理,控制对对象的访问.可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理(即:AOP的微观实现) AOP(Asp ...

随机推荐

  1. Spring+SpringMVC+MyBatis+easyUI整合基础篇(五)讲一下maven

    github地址,点这里. 项目效展示,点这里.账号:admin 密码:123456 下一篇文章开始,所有的项目源码都是与maven整合后的代码了,所以这一篇讲一讲maven. 1.简单介绍 我们看一 ...

  2. VUE2.0实现购物车和地址选配功能学习第五节

    第五节 单件商品金额计算和单选全选功能 1.vue精髓在于操作data模型来改变dom,渲染页面,而不是直接去改变dom 2.加减改变总金额功能: html:<div class="c ...

  3. markdown中常见的转义字符

    markdown中的转义字符 字符 转义后字符 & & " " > > < < 不断空格   \ \\ ` \` * \* _ \_ {} ...

  4. C#一定比C++性能差?当然不!破除迷信,从我做起!

    几乎所有的程序员在初学编程之时,都被灌输过"托管语言(Java.C#)性能比非托管语言(C.C++)差好多" 的迷信教条.如果你问他们为什么,他们一定会说:托管语言需要通过虚拟机或 ...

  5. perl 之eval

    eval是个表达式,语句末尾有一个分号, 发现在它的监视范围内出现致命错误,会立即停止运行整个块,退出后继续运行其 余的代码   eval的返回值就是语句块最后一条表达式的执行结果   eval非正常 ...

  6. MySQL索引的使用方式

    一,create CREATE INDEX可对表增加普通索引或UNIQUE索引. CREATE INDEX index_name ON table_name (column_list) CREATE ...

  7. MongoDB【第三篇】RockMongo 的安装

    第一步:准备 1. 安装 Nginx 参照 Nginx[第一篇]安装 2. 安装 php 参照 PHP[第一篇]安装 3. RockMongo 安装包 rockmongo-v1.0.5.r53.zip ...

  8. 把Eclipse项目转换成Maven项目

    把Maven项目转换成Eclipse项目只要使用Maven的Eclipse插件就能做到 mvn eclipse:eclipse 其实Maven的Eclipse插件也有把Eclipse项目转换成Mave ...

  9. 3297: [USACO2011 Open]forgot

    3297: [USACO2011 Open]forgot Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 69  Solved: 51[Submit][ ...

  10. python--对函数的理解

    函数的定义 def functionname(arg): Suite Return [expression] 1.def 定义函数时的关键字 2.functionname 函数名 3.arg函数的参数 ...