java設計模式:動態代理模式 Proxy
阿新 • • 發佈:2019-02-04
代理模式基本上可以理解為:本來讓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.