代理模式

原创 2016年08月29日 14:50:22

基本概念

代理模式(Proxy):为其他对象提供一种代理,并控制该对象的访问(Provide asurrogate or placeholder foranother object to control access to it. )。而对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。它是给某一个对象提供一个替代者(占位者),使之在client对象和subject对象之间编码更有效率。代理可以提供延迟实例化(lazy instantiation),控制访问等。

三种角色:

  1. 抽象角色:声明真实对象和代理对象的共同接口
  2. 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
  3. 真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

这里写图片描述
应用场景:

构建一个对象很耗费时间和计算机资源,代理模式(Proxy)允许我们控制这种情况,直到我们需要使用实际的对象。(如:比如一幅很大的图像,需要载入的时间很长)

动态代理在spring的AOP中应用很多:spring动态代理主要有2种:JDK反射机制();cglib

缺点:

由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

Spring AOP的2种动态代理方式

1. JDK反射机制

http://blog.csdn.net/intlgj/article/details/5671927

实现Java.lang.reflect.InvocationHandler接口,复写其中的invoke方法。

涉及1个接口和1个类:

  1. 接口: InvocationHandler。唯一方法:public object invoke(Object obj,Method method, Object[] args):第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组。
  2. 类:Proxy。动态代理类,运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。

2. cglib

http://blog.csdn.net/wsh622827/article/details/4708329

cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。cglib封装了asm,可以在运行期动态生成新的class。asm 是一个强大的 Java 字节码生成框架,和 BCEL 或者 SERP 很类似,但是小很多,可以动态修改 java 字节码。

cgLib 可以不用接口,它底层调用asm 动态生成一个代理类去覆盖父类中非 final 的方法,然后实现 MethodInterceptor 接口的 intercept 方法,这样以后直接调用重写的方法,比 JDK 要快。但是加载 cglib 消耗时间比直接 JDK 反射时间长,开发的过程中,如果是反复动态生成新的代理类推荐用 JDK 自身的反射,反之用 cglib。

这里写图片描述

版权声明:本文为博主学习笔记。

浅析JavaScript设计模式——代理模式

代理模式 为一个对象提供一个代用品或占位符,以便控制对它的访问 好久没有写设计模式的文章了 今天要写的代理模式可能内容要多一些 代理模式非常有用,代理模式也分为很多很多种,我只谈一些常见并且...
  • q1056843325
  • q1056843325
  • 2016年11月17日 20:33
  • 1023

谈谈JAVA的代理模式认识 一——为什么使用代理模式

一、中介隔离作用     代理模式,第一次接触它,是在学习.Net的时候看的一本书,叫做《大话设计模式》,至今已快三年了。相信看过这本书的同学们,都记得书中的代理模式,就是为他人做嫁衣裳的故事。好,我...
  • wangyongxia921
  • wangyongxia921
  • 2015年05月28日 16:24
  • 21873

代理模式的简单例子

【代理模式应用场景举例】比如在玩“极品飞车”这款游戏,如果游戏者手中的金钱达到了一定的数量就可以到车店买一部性能更高的赛车,那么这个卖车的“车店”就是一个典型的“汽车厂家”的“代理”,他为汽车厂家“提...
  • lishaojun0115
  • lishaojun0115
  • 2016年02月26日 11:51
  • 1675

【学习笔记javascript设计模式与开发实践(代理模式)----6】

第6章代理模式  代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问。 代理模式是一种非常有意义的模式,在生活中可以找到很多代理模式的场景。比如明星都有经济人作为代理。如果想请明星来办一场...
  • pigpigpig4587
  • pigpigpig4587
  • 2015年12月16日 17:07
  • 1115

Android设计模式之代理模式 Proxy

一.概述 代理模式也是平时比较常用的设计模式之一,代理模式其实就是提供了一个新的对象,实现了对真实对象的操作,或成为真实对象的替身.在日常生活中也是很常见的.例如A要租房,为了省麻烦A...
  • l2show
  • l2show
  • 2015年07月28日 22:14
  • 20607

状态模式--策略模式--代理模式

状态模式:意图:   允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。适用性:   在下面的两种情况下均可使用 S t a t e模式:   • 一个对象的行为取决于它的...
  • lonewolf521125
  • lonewolf521125
  • 2015年05月19日 11:43
  • 903

代理模式的java实现例子

代理模式:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。...
  • pnjlc
  • pnjlc
  • 2016年09月30日 11:37
  • 929

代理模式使用场合与注意事项

代理 模式的定义:      为其它对象提供一种代理以控制这个对象的访问--《设计模式》GOF 注意事项: 1. 接口并不是必须的,大多数情况下,我们为了保持对对象操作的透明性,并强制实现类实现代理类...
  • dzta831121
  • dzta831121
  • 2015年11月17日 16:50
  • 618

代理模式与Android

代理模式(Proxy)一、   什么是代理模式先来看看官方的说法,代理模式就是为其他对象提供一种代理,以控制对这个对象的访问。 看来这个官方的说法的确有点官方,看了还是让人感觉不点不知所措,还是不明白...
  • ljianhui
  • ljianhui
  • 2014年06月09日 00:25
  • 8158

如何解决代理模式详解的原理详解

我特意将本系列改了下名字,原名是《设计模式学习之路》,原因是因为之前写过一篇《spring源码学习之路》,但是我感觉本次写二十三种设计模式,更多的还是分享给各位自己的理解,所以感觉学习之路有点不合适,...
  • t93z5uusca
  • t93z5uusca
  • 2017年05月10日 03:38
  • 383
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:代理模式
举报原因:
原因补充:

(最多只允许输入30个字)