代理模式基本上可以理解为:本来让A做一件事情,可以把事情交给A的代理B去处理,B不仅仅把A该做的做掉,还可以在A该做的事情的基础上在做一些相关的事情;
所谓动态代理就是利用Java的反射机制,由程序来动态创建代理类。
一般应用场景:添加操作的log日志,事务。。。。
1.
public interface ISubject {
/**
* 被代理类要执行的方法
*/
public void doSomething();
}
public class RealSubject implements ISubject {
/**
* @see test.yang.designPattern.proxy.ISubject#doSomething()
*/
@Override
public void doSomething() {
System.out.println("call doSomething");
}
}
public class ProxyHandler implements InvocationHandler {
/**
* 代理
*/
private final Object proxied;
/**
* @param proxied
* 代理
*/
public ProxyHandler(final Object proxied) {
this.proxied = proxied;
}
/**
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
*/
@Override
public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
// 在转调具体目标对象之前,可以执行一些功能处理
System.out.println("before call doSomething(添加代理执行方法)");
// 转调具体目标对象的方法
final Object invoke = method.invoke(proxied, args);
// 在转调具体目标对象之后,可以执行一些功能处理
System.out.println("after call doSomething(添加代理执行方法)");
return invoke;
}
}
public class ProxyTest {
public static void main(final String[] args) {
/* 定义被代理对象 */
final ISubject realSubject = new RealSubject();
/* 由被代理对象生成代理对象 */
final ProxyHandler proxyHandle = new ProxyHandler(realSubject);
final ISubject proxySubject = (ISubject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass()
.getInterfaces(), proxyHandle);
/* 让代理对象【代理】被代理对象去做事 */
proxySubject.doSomething();
}
}
2.
3.