浅析静态代理和动态代理

2019-06-22  本文已影响0人  heqinglin8

代理模式

** 一、概述**

代理是一种模式,提供了对目标对象的间接访问方式,即通过代理访问目标对象。如此便于在目标实现的基础上增加额外的功能操作,前拦截,后拦截等,以满足自身的业务需求,同时代理模式便于扩展目标对象功能的特点也为多人所用。

 二、图形描述

18266625-85b67eb9fefbdff5.png

三、静态代理

静态代理的实现比较简单,代理类通过实现与目标对象相同的接口,并在类中维护一个代理对象。通过构造器塞入目标对象,赋值给代理对象,进而执行代理对象实现的接口方法,并实现前拦截,后拦截等所需的业务功能。
、、、
package cn.com.autohome.testlibrary.proxy;
public interface IPerson {

/**
 * 接口
 */
void eat();

}

package cn.com.autohome.testlibrary.proxy;

public class ManProxy implements IPerson {

IPerson mPerson;
public ManProxy(IPerson person) {
    mPerson = person;
}

@Override
public void eat() {
    System.out.println("先喝口汤······");
    mPerson.eat();
    System.out.println("洗碗·········");
}

}

package cn.com.autohome.testlibrary.proxy;

public class Man implements IPerson {
@Override
public void eat() {
System.out.println(this.getClass().getName() + " 吃饭了。。。。。");
}
}

package cn.com.autohome.testlibrary.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyFactory {
private Object targetObject;
public ProxyFactory(Object targetObject) {
this.targetObject = targetObject;
}

public Object getProxyInstance(){
  return  Proxy.newProxyInstance(
            this.targetObject.getClass().getClassLoader(),
            this.targetObject.getClass().getInterfaces(),
            new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    System.out.println("先喝口汤······动态代理");

                    Object obj = method.invoke(ProxyFactory.this.targetObject, args);

                    System.out.println("洗碗·········动态代理");
                    return obj;
                }
            }
    );
}

}

public class MyClass {
public static void main(String args[]) {
System.out.println("+++++++++++++静态代理 +++++++");
Man man = new Man();

    ManProxy manProxy = new ManProxy(man);
    manProxy.eat();

    System.out.println("+++++++++++++ 动态代理 +++++++");

    IPerson personProxy = (IPerson) new ProxyFactory(new Man()).getProxyInstance();
    personProxy.eat();
}

}
、、、

静态代理的总结

优点:可以做到不对目标对象进行修改的前提下,对目标对象进行功能的扩展和拦截。

缺点:因为代理对象,需要实现与目标对象一样的接口,会导致代理类十分繁多,不易维护,同时一旦接口增加方法,则目标对象和代理类都需要维护。

四、动态代理

动态代理是指动态的在内存中构建代理对象(需要我们制定要代理的目标对象实现的接口类型),即利用JDK的API生成指定接口的对象,也称之为JDK代理或者接口代理。

上一篇 下一篇

猜你喜欢

热点阅读