作用:
为其他对象提供一种代理以控制对这个对象的访问。
角色:
抽象角色:声明真实对象和代理对象的共同接口
代理角色:代理角色内部包含有真实对象的引用,从而可以操作真实对象。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
代理设计模式分为静态代理和动态代理。
静态代理:
抽象角色:
public interface Subject {
void dosomething();
}
真实角色:
public class RealSubject implements Subject{
@Override
public void dosomething() {
System.out.println("aaaaaaaaaaa");
}
}
代理角色:
public class ProxySubject implements Subject{
Subject sub;
public ProxySubject(Subject sub){
this.sub = sub;
}
@Override
public void dosomething() {
System.out.println("dosomethingPre");
sub.dosomething();
System.out.println("dosomethingPost");
}
}
运用:
public static void main(String[] args) {
ProxySubject ps = new ProxySubject(new RealSubject());
ps.dosomething();
}
输出:
dosomethingPre
aaaaaaaaaaa
dosomethingPost
缺点:
如果类方法数量越来越多的时候,代理类的代码量是十分庞大的
动态代理:
java.lang.reflect.Proxy :Proxy类 提供创建动态代理实例的静态方法。
InvocationHandler 是一个接口,代表调用处理程序,连接代理实例和真实角色。
每个代理实例都具有这样一个调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的中的invoke方法。
理解:
动态Proxy是这样的一种类:
它是在运行生成的类,在生成时你必须提供一组Interface给它,然后该class就宣称它实现了这些interface。你可以把该class的实例当作这些interface中的任何一个来用。当然,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
在使用动态代理类时,我们必须实现InvocationHandler接口。
public class ProxyHandler implements InvocationHandler{
Object tar;
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//can do something
method.invoke(tar, args);
//can do something
return null;
}
public Object bind(Object tar){
this.tar = tar;
return Proxy.newProxyInstance(tar.getClass().getClassLoader(), tar.getClass().getInterfaces(), this);
}
}
使用:
public class ProxyTest {
public static void main(String[] args) {
RealSubject real = new RealSubject();
ProxyHandler h = new ProxyHandler();
Subject o = (Subject) h.bind(real);
o.dosomething();
}
}
输出:
aaaaaaaaaaa