目录
什么是代理模式
代理模式是提供一种代理机制来控制对被代理对象的访问的控制的设计模式。
为什么要用代理模式
通过代理模式可以很好的对被代理对象控制,在调用被代理对象实现核心业务逻辑的情况下,也可以很好的对业务前后做一些辅助工作,而无须修改被代理对象。
代理模式组成(动态代理)
抽象对象
public interface Subjiect {
/**
* 业务操作
* @param str str
*/
public void doSomething(String str);
}
真实对象
public class RealSubjiect implements Subjiect {
@Override
public void doSomething(String str) {
System.out.println("real do something -----> " + str);
}
}
动态代理的Handler类
public class MyInvocationHandler implements InvocationHandler {
/**
* 被代理对象
*/
private Object target = null;
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(this.target, args);
}
}
动态代理
public class DynamicProxy {
@SuppressWarnings("unchecked")
public static <T> T newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) {
//前置通知
new BeforeAdvice().exec();
//执行被代理对象相关方法
return (T) Proxy.newProxyInstance(loader, interfaces, h);
}
}
通知接口
public interface IAdvice {
public void exec();
}
前置通知
public class BeforeAdvice implements IAdvice {
@Override
public void exec() {
System.out.println("具体前置通知,做了前置通知该做的事");
}
}
测试驱动
public class Client {
public static void main(String[] args) {
Subjiect subjiect = new RealSubjiect();
InvocationHandler handler = new MyInvocationHandler((subjiect));
Subjiect proxy = DynamicProxy.newProxyInstance(subjiect.getClass().getClassLoader(), subjiect.getClass().getInterfaces(), handler);
proxy.doSomething("Finish");
}
}