代理模式实际上就是代理类帮助真实类执行它的方法,并且可以加上一些其他操作。代理模式有静态代理和动态代理。JDK中提供了实现动态代理的功能。
接口和真实类
接口
public interface ProxyInterface {
void doSomething();
void sleep();
}
真实类
public class RealObject implements ProxyInterface{
@Override
public void doSomething() {
System.out.println("RealObject doSomething...");
}
@Override
public void sleep() {
System.out.println("RealObject sleep...");
}
}
静态代理
代理类
public class StaticProxy implements ProxyInterface{
private final RealObject realObject = new RealObject();
@Override
public void doSomething() {
System.out.println("start1");
realObject.doSomething();
System.out.println("end1");
}
@Override
public void sleep() {
System.out.println("start2");
realObject.sleep();
System.out.println("end2");
}
}
静态代理功能测试
public class TestStaticProxy {
public static void main(String[] args) {
StaticProxy staticProxy = new StaticProxy();
staticProxy.doSomething();
staticProxy.sleep();
}
}
动态代理
public class ProxyHandler implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("doSomething")) {
System.out.println("start1");
// 反射执行真实类对象的方法
method.invoke(new RealObject(), args);
System.out.println("end1");
}
else if (method.getName().equals("sleep")) {
System.out.println("start2");
method.invoke(new RealObject(), args);
System.out.println("end2");
}
return null;
}
}
动态代理功能测试
public class TestProxy {
public static void main(String[] args) {
// 生成代理对象
ProxyInterface proxy = (ProxyInterface) Proxy.newProxyInstance(ProxyInterface.class.getClassLoader(), new Class[]{ProxyInterface.class}, new ProxyHandler());
// 代理对象在帮RealObject执行它的方法,并增加一些操作
proxy.doSomething();
proxy.sleep();
}
}