代理模式

GOF23(6)之代理模式(结构型模式)

人走茶凉 提交于 2020-02-06 03:45:15
1、核心作用 通过代理,控制对对象的访问。可以详细控制访问某个对象的方法,在调用这个方法之前做前置处理,调用这个方法之后做后置处理。Spring的AOP就是利用代理模式进行实现的。 2、代理模式的角色 抽象角色:定义代理角色和真实角色的公共对外方法; 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色使用; 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。实现了将统一的流程控制放到了代理角色中处理。 代理角色持久真实角色的引用 3、应用场景 安全代理:屏蔽对真实对象的直接访问; 远程代理:通过代理类处理远程方法调用(RMI); 延迟加载:先加载轻量级的代理对象,真正需要的时候才加载真实的对象。比如开发一个大文档查看软件,里面有大量的图片,有可能图片的大小有100M,在打开文件时不可能将所有的图片都显示出来,于是可以使用代理模式,当需要查看图片时,用proxy进行大图片的打开。 4、分类 代理可以分为静态代理和动态代理; 静态代理:静态生产代理类。 动态代理:动态生成代理类。 实现动态代理的技术:JDK自带的动态代理,javaassist字节码操作库实现,CGLIB,ASM(底层使用指令,可维护性较差)。 5、代码实现 5.1 静态代理 5.1.1 创建抽象角色 package com.zdw.proxy

JDK动态代理和CGLIB动态代理

ぃ、小莉子 提交于 2020-02-06 03:18:22
JDK动态代理 //1.影星接口 package com.entity; //影星接口 public interface MovieStar { public void act();//演戏 } //2.被代理类----实现一个接口 package com.entity; //成龙 public class ChengLongStar implements MovieStar{ @Override public void act() { System.out.println("我是成龙,我会拍戏"); } } //3.代理类----实现InvocationHandler接口 package com.entity; import java.lang.reflect.InvocationHandler;//java的设计模式 import java.lang.reflect.Method; import java.lang.reflect.Proxy; //成龙的经纪人类 public class ChengLongProxy implements InvocationHandler{ //被代理的原始对象 private Object orientObject;//被代理对象 //绑定被代理对象,返回一个代理对象 public Object bind(Object obj){

23种设计模式

孤街浪徒 提交于 2020-02-06 03:04:44
1.单例模式(Singleton Pattern) 定义: Ensure a class has only one instance, and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。) 通用代码:(是线程安全的) public class Singleton { private static final Singleton singleton = new Singleton(); //限制产生多个对象 private Singleton(){ } //通过该方法获得实例对象 public static Singleton getSingleton(){ return singleton; } //类中其他方法,尽量是static public static void doSomething(){ } } 使用场景: ● 要求生成唯一序列号的环境; ● 在整个项目中需要一个共享访问点或共享数据,例如一个Web页面上的计数器,可以不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是线程安全的; ● 创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源; ● 需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式(当然

20191218JDK和CGLIB动态代理区别

半腔热情 提交于 2020-02-05 09:35:03
前言 Spring代码实例:https://github.com/yihonglei/spring-study JDK动态代理实现原理(jdk8):https://blog.csdn.net/yhl_jxy/article/details/80586785 CGLIB动态代理实现原理:https://blog.csdn.net/yhl_jxy/article/details/80633194 一 JDK和CGLIB动态代理原理 1、JDK动态代理 利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类, 在调用具体方法前调用InvokeHandler来处理。 2、CGLIB动态代理 利用ASM开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。 3、何时使用JDK还是CGLIB? 1)如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP。 2)如果目标对象实现了接口,可以强制使用CGLIB实现AOP。 3)如果目标对象没有实现了接口,必须采用CGLIB库,Spring会自动在JDK动态代理和CGLIB之间转换。 4、如何强制使用CGLIB实现AOP? 1)添加CGLIB库(aspectjrt-xxx.jar、aspectjweaver-xxx.jar、cglib-nodep-xxx.jar) 2

设计模式——代理模式

淺唱寂寞╮ 提交于 2020-02-04 12:22:19
在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买。又如找女朋友、找保姆、找工作等都可以通过找中介完成。 在软件设计中,使用代理模式的例子也很多,例如,要访问的远程对象比较大(如视频或大图像等),其下载要花很多时间。还有因为安全原因需要屏蔽客户端直接访问真实对象,如某单位的内部数据库等。 代理模式定义如下: 代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。 Proxy Pattern: Provide a surrogate or placeholder for another object to control access to it. 代理模式是一种对象结构型模式。在代理模式中引入了一个新的代理对象,代理对象在客户端对象和目标对象之间起到中介的作用,它去掉客户不能看到的内容和服务或者增添客户需要的额外的新服务。 代理模式结构与实现 模式结构 代理模式的结构比较简单,其核心是代理类,为了让客户端能够一致性地对待真实对象和代理对象,在代理模式中引入了抽象层,代理模式结构如图15-2所示 图15-2 代理模式结构图 由图15-2可知,代理模式包含如下三个角色: (1) Subject (抽象主题角色)

Spring AOP

和自甴很熟 提交于 2020-02-04 04:15:20
  在前面的文章中已经和大家分享过关于spring IOC的知识,已经通过他的实现机制。我们都知道spring的两大核心:AOP(面向切面)和IOC(控制反转),本篇我们就一起学习一下AOP的知识的。   这里分享一个问题?当我们软件开发完成后,需要给每一个方法添加操作日志,我们怎么操作呢?我想最简单的方法就是在每一个方法的开始前将我们的日志逻辑加入,当然这是最直接的一种方法,但是他的缺点也是很明细,如果我们的方法有很多,添加这个日志逻辑就需要很多的工作量,显然这是一种不可取的方式。如何更好的解决这个问题呢?spring很好的帮我们处理了这个难点,通过切面编程,我们可以在我们需要的切面添加相应的业务逻辑已达到我们需要的效果。   接下来开始我们的内容,AOP的实现借助于JAVA的动态代理知识,我先通过动态代理的方式为大家介绍一下AOP的实现原理,以便大家更好的理解。   每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。我们来看看InvocationHandler这个接口的唯一一个方法 invoke 方法: Object invoke(Object proxy,

动态代理详解

耗尽温柔 提交于 2020-02-03 19:37:46
动态代理详解     动态代理 它可以直接给某一个 目标对象 生成一个 代理对象 ,而不需要代理类存在。     动态代理与代理模式原理是一样的,只是它 没有具体的代理类 ,直接通过 反射 生成了一个代理对象。     动态代理生成技术:         1. 基于jdk提供一个 Proxy类 ,可以直接给实现某接口的实现类直接生成代理对象。         2. 基于cglib (spring框架会学习)     java.lang.reflect.Proxy;   该类可以直接生成一个代理对象。     Proxy类的方法 :         public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 返回一个指定接口的代理类实例。             仅能代理实现至少一个接口的类(即目标对象需要至少有一个接口)。             ClassLoader:类加载器。固定写法,和被代理类使用相同的类加载器即可。             Class[]:代理类要实现的接口。固定写法,和被代理类使用相同的接口即可。             InvocationHandler: 策略(方案)设计模式 的应用。 如何去具体实现代理

代理模式

五迷三道 提交于 2020-02-03 04:08:48
代理模式通过代理对象为原对象增加某种功能,是Spring AOP的实现方式。代理模式主要分为 静态代理 和 动态代理 . 静态代理模式与 装饰器模式 类似,在此就不展示代码了。静态代理的主要缺点是一个代理类只能用于一个被代理类,是一种『类专用』的代理,被代理类和代理类的组合数是乘积关系。下面通过代码演示Java中的动态代理模式。 Java动态代理模式通过 InvocationHandler 接口和 Proxy 类实现。 Invocation 接口的 invoke 方法通过反射的方式调用被代理类的方法并增加代理逻辑,Proxy类用于生成代理对象。动态代理模式中,代理逻辑和被代理逻辑是分离的,被代理类和代理类的组合数是加和关系。动态代理模式,使用反射动态地在运行时生成代理类,解除了被代理类和代理类的逻辑耦合,减少了类的个数,提高了代理模式的可维护性,但是由于使用了反射,效率相对静态代理模式要低一些。下面以一个例子说明Java动态代理模式。 被代理接口:Operator.java,抽象的操作符 public interface Operator { public int operate ( int a , int b ) ; } 被代理类:AddOperator.java,完成多次加法 public class AddOperator implements Operator {

Java 静态代理和动态代理

最后都变了- 提交于 2020-02-02 10:07:29
Java 静态代理 静态代理通常用于对原有业务逻辑的扩充。比如持有二方包的某个类,并调用了其中的某些方法。然后出于某种原因,比如记录日志、打印方法执行时间,但是又不好将这些逻辑写入二方包的方法里。所以可以创建一个代理类实现和二方方法相同的方法,通过让代理类持有真实对象,然后在原代码中调用代理类方法,来达到添加我们需要业务逻辑的目的。 这其实也就是代理模式的一种实现,通过对真实对象的封装,来实现扩展性。 一个典型的代理模式通常有三个角色,这里称之为**代理三要素** 共同接口 public interface Action { public void doSomething ( ); } 真实对象 public class RealObject implements Action{ public void doSomething () { System.out.println( "do something"); } } 代理对象 public class Proxy implements Action { private Action realObject; public Proxy (Action realObject) { this.realObject = realObject; } public void doSomething () { System.out.println

JDK动态代理

爷,独闯天下 提交于 2020-02-02 10:03:29
一、基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念。代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念。这里引用维基百科上的一句话对代理进行定义: A proxy is an agent or substitute authorized to act for another person or a document which authorizes the agent so to act. 意思是说:代理指的是一个代理人(或替代品),它被授权代表另外一个人(或文档)。 从这个简明扼要的定义中,可以看出代理的一些特性:1.代理存在的意义就是代表另一个事物。2.代理至少需要完成(或实现)它所代表的事物的功能。 2.什么是JAVA静态代理? JAVA静态代理是指由程序员创建或工具生成的代理类,这个类在编译期就已经是确定了的,存在的。 典型的静态代理模式一般包含三类角色: 1.抽象角色:它的作用是定义一组行为规范。抽象角色一般呈现为接口(或抽象类),这些接口(或抽象类)中定义的方法就是待实现的。 2.真实角色:实现了抽象角色所定义的行为。真实角色就是个普通的类,它需要实现抽象角色定义的那些接口。 3.代理角色:代表真实角色的角色。根据上面代理的定义,我们可以知道代理角色需要至少完成(或实现)真实角色的功能。为了完成这一使命