静态代理与动态代理
代理模式是java开发中用到的相对比较多的设计模式,其中的思想就是主业务和相关业务分离。所谓的代理设计就是指由一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其他相关业务的处理。比如我们在进行删除操作的时候需要检验一下用户是否登陆,我们可以删除看成主业务,而把检验用户是否登陆看成其相关业务,那么这个活动就可以用代理模式来进行处理。
首先我们来看一下静态代理,在使用静态代理时,代理对象和被代理对象实现统一接口,随意在应用代理时首先要编写一个接口:
public interface IHello { public void sayHello1() ; public void sayHello2() ; public void sayHello3() ; public void sayHello4() ; }
然后编写代理对象,该类和被代理对象一样实现接口IHello.java,只不过在代理对象中增加需要的服务,
代理类ProxyHello.java代码如下:
package com.spring.test; /** *这里使用构造方法来传递实现接口IHello的任意类,而在IHello的几个业务方法中调用的是传递进去的类方法 *,在各个方法中增加相应的服务,这就是前面说的代理。 */ public class ProxyHello implements IHello { private IHello hello; public ProxyHello(IHello hello) { this.hello = hello; } public void validateUser() { System.out.println("验证用户"); } public void sayHello1() { validateUser(); hello.sayHello1(); } public void sayHello2() { validateUser(); hello.sayHello2(); } public void sayHello3() { validateUser(); hello.sayHello3(); } public void sayHello4() { validateUser(); hello.sayHello4(); } }
然后就是编写被代理类,该类实现IHello接口,代码如下:
package com.spring.test; public class Hello implements IHello{ public void sayHello1() { System.out.println("111111111111"); } public void sayHello2() { System.out.println("222222222222"); } public void sayHello3() { System.out.println("333333333333"); } public void sayHello4() { System.out.println("444444444444"); } }
然后就是测试了:
@Test public void testHello() { IHello hello = new ProxyHello(new Hello()); hello.sayHello1(); hello.sayHello2(); hello.sayHello3(); hello.sayHello4(); }
执行结果:
验证用户
111111111111
验证用户
222222222222
验证用户
333333333333
验证用户
444444444444
从上面看来,静态代理其设计方法上就是被代理类Hello只关注与其主业务的具体实现而不用关心其他的业务,将Hello的对象注入到代理类中,然后在进行方法的包装,用这种方式来解耦合,不过很显然在静态代理中我么可以看到,我们要为接口中的每个方式实现一个验证方法,代码量很大,更重要的是加入接口中增加一个方法或者减少一个方法都需要去修改代理类中的代码,很不方便。那么我们就想到了动态代理。
动态代理:
动态代理是根据静态代理机制,抽象出一个泛型代理。他不依赖任何被代理对象的代理实现,该动态代理类需要实现InvocationHandler接口
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * * <pre> * 项目名称:SpringTest * 类名称:DynamicProxy * 类描述: * 创建人:ZDX * 创建时间:2014年11月22日 上午12:09:44 * 修改人:ZDX * 修改时间:2014年11月22日 上午12:09:44 * 修改备注: * @version * </pre> */ public class DynamicProxy implements InvocationHandler { private Object object; /** * * <pre> * 方法名称:bind * 方法描述: 该类的bind()方法中使用Proxy的静态方法 * newProxyInstance建立一个代理对象,该方法中有3个参数, * 第一个参数是指定代理类的类加载器, * 第二个参数指定被代理类的实现接口, * 第三个参数指定方法调用的处理程序,这里即本程序 * * @version * </pre> */ public Object bind(Object object) { this.object = object; return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this); } /** * <pre> * 调用invoke方法会传入被代理对象的方法与参数, * 也就是说,通过method.invoke(object, args)调用代理类对象中 * 的方法,返回结果也就是代理对象中方法的返回结果。 * * </pre> */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; try { validateUser(); result = method.invoke(object, args); } catch (Exception e) { e.printStackTrace(); } return result; } public void validateUser() { System.out.println("验证用户"); } }
相关推荐
Java设计模式——代理设计模式(静态代理和动态代理) 各种情况例子源码
此资源为文章中《代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)》与《 AOP动态代理声明式的3种配置方式过程与区别》的案例代码,可下载参考学习。
NULL 博文链接:https://871656094.iteye.com/blog/2355335
java 代理模式实现代码及设计详解:动态代理模式、静态代理模式
java设计模式【之】静态代理【源码】【场景:帮爸爸买菜】.rar * 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法调用 * ...
设计模式之代理模式_静态代理的一个java实现的demo。主类在Client中。仅代码实现,可供初学者参考使用
自己编写的代理设计模式,示例中的代码绝对没有使用伪代码,是开发的项目真实案例,简单易懂
静态代理设计模式1.1 静态代理 – 实现步骤1.2 静态代理 – 逻辑图 & 源码示例1.3 静态代理 – 优缺2. 装饰者设计模式 – 类似静态代理2.1 装饰者模式 – 实现步骤2.2 装饰者模式 – 逻辑图 & 源码示例2.3 装饰者...
//代理模式内部引用了真实角色 public void requst() { this.preRequest(); //在真实角色操作之前所附加的操作 if(null == realsubject) { realsubject = new ReallSubject(); } realsubject.requst(); // ...
静态代理总结: 优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展。 缺点:我们得为每一个服务都得创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改。
资源列举了设计模式中的静态代理和动态代理的简单java实现,jdk1.8版本经过测试验证,对于想学习设计模式的童靴应该有所帮助
Java中的代理是一种常见的设计模式,它可以帮助我们在不改变原有代码逻辑的情况下,对现有对象进行增强或扩展。在代理模式中,主要有两种类型:静态代理和动态代理。 1.静态代理: 静态代理是指在编译期间就已经确定...
静态代理和动态代理简单实现代码.Proxy.其中静态代理我写了两个demo,有一个是最原始的,还有一个放在程杰的大化设计模式的代理模式写的,纯属娱乐。
Java设计模式之代理模式 1.代理模式 1.1 静态代理 1.2 动态代理 1.3.代理模式使用原因和应用方面
描述了安卓代理模式的动态代理和静态代理两种代理方式的使用
代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个...
设计模式之代理模式Java实现和类设计图,包括静态代理和动态代理
java设计模式【之】JDK动态代理【源码】【场景:帮爸爸买菜】.rar /** * 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法...
代理模式:是一种设计模式,提供了对目标对象的间接访问方式,即通过代理访问目标对象。如此便于在目标实现的基础上增加额外的功能操作,前拦截,后拦截等,以满足自身的业务需求,同时代理模式便于扩展目标对象功能...
单例设计模式案例演示 单例模式,是一种常用的软件设计模式。通过单例模式可以保证系统中,**应用该模式的这个类只有一个实例**。即一个类只有一个对象实例。 #### 单例设计模式实现步骤 1. 将构造方法私有化,使其...