代理模式
** 一、概述**
代理是一种模式,提供了对目标对象的间接访问方式,即通过代理访问目标对象。如此便于在目标实现的基础上增加额外的功能操作,前拦截,后拦截等,以满足自身的业务需求,同时代理模式便于扩展目标对象功能的特点也为多人所用。
二、图形描述
三、静态代理
静态代理的实现比较简单,代理类通过实现与目标对象相同的接口,并在类中维护一个代理对象。通过构造器塞入目标对象,赋值给代理对象,进而执行代理对象实现的接口方法,并实现前拦截,后拦截等所需的业务功能。
、、、
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代理或者接口代理。