什么是代理模式
代理是一种常用的设计模式,其目的就是对其他对象提供一个代理以控制对某个对象的访问,代理类为委托类提供预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。
静态代理
代理类和被代理类实现同一个接口
/**
* 接口
*/
public interface Developer {
void code();
}
/**
* 被代理类
*/
public class JavaDeveloper implements Developer {
@Override
public void code() {
System.out.println("我正在编写Java代码");
}
}
/**
* 代理类
*/
public class Mathine implements Developer {
/**
* 需要拥有被代理的真正实例
*/
public Developer developer;
public Mathine(Developer developer) {
this.developer = developer;
}
@Override
public void code() {
developer.code();
}
}
public class ProxyTest {
public static void main(String[] args) {
//通过静态代理实现JavaDeveloper进行code
Developer developer = new JavaDeveloper();
Mathine mathine = new Mathine(developer);
//编写代码
mathine.code();
}
}
动态代理
动态代理分为两种Java JDK代理和cglib
JDK代理主要用到了InvocationHandler和Proxy类
InvocationHandler是一个接口,它的实现类可以认为是具体的代理实现
Proxy生成代理的具体操作类,可以为一个或多个接口动态的生成代理类
/**
* 动态代理的执行类
*/
public class MathineCompany {
/**
* 被代理类
*/
private Object proxyedObject;
public MathineCompany(Object proxyedObject) {
this.proxyedObject = proxyedObject;
}
public Object getProxyedObject() {
Object o = Proxy.newProxyInstance(proxyedObject.getClass().getClassLoader(), proxyedObject.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
preProxyMethod();
method.invoke(proxyedObject, args);
postProxyMethod();
return null;
}
});
return o;
}
public void preProxyMethod() {
System.out.println("执行代理前的方法");
}
public void postProxyMethod() {
System.out.println("执行代理后的方法");
}
}
public class ProxyTest {
public static void main(String[] args) {
//动态代理实现
Developer developer1 = new JavaDeveloper();
MathineCompany mathineCompany = new MathineCompany(developer1);
Developer dev = (Developer) mathineCompany.getProxyedObject();
dev.code();
}
}