代理模式

給目標(biāo)對象提供一個代理對象,并由代理對象控制對目標(biāo)對象的引用。

靜態(tài)代理

image.png
package proxy;

public interface Subject {
    void doSomthing();
}
package proxy;

public class RealSubject implements Subject{

    @Override
    public void doSomthing() {
        System.out.println("I need do some things");
    }
}
package proxy;

public class ProxySubject implements Subject {
    private Subject subject;
    @Override
    public void doSomthing() {
        subject = new RealSubject();
        subject.doSomthing();
    }
}

動態(tài)代理

動態(tài)代理相關(guān)API

API 用途
Proxy#newProxyInstance 創(chuàng)建一個代理
InvocationHandler#invoke 用于處理動態(tài)代理類對對象的方法調(diào)用

如何創(chuàng)建動態(tài)代理

第一步,實現(xiàn)InvocationHandler接口,并重寫invoke方法。在invoke方法中處理代理類中需要處理的邏輯。

package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class DynamicProxyHandler implements InvocationHandler {
    Object proxied;

    public DynamicProxyHandler(Object proxied){
        this.proxied = proxied;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("method="+method+"   proxy="+proxy.getClass());
        if (args != null) {
            for (Object arg: args) {
                System.out.println("arg="+arg);
            }
        }
        return method.invoke(proxied, args);
    }
}

第二步,使用Proxy#newProxyInstance創(chuàng)建代理對象。newProxyInstance方法的參數(shù)分別為:

  • ClassLoader loader:指定當(dāng)前目標(biāo)對象使用類加載器,用null表示默認(rèn)類加載器
  • Class [] interfaces:需要實現(xiàn)的接口數(shù)組
  • InvocationHandler handler:調(diào)用處理器,執(zhí)行目標(biāo)對象的方法時,會觸發(fā)調(diào)用處理器的方法,從而把當(dāng)前執(zhí)行目標(biāo)對象的方法作為參數(shù)傳入
package proxy;

import java.lang.reflect.Proxy;

public class Test {
    public static void main(String[] args) {
        // 動態(tài)代理
        Subject real = new RealSubject();
        Subject proxy = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(),
                new Class[]{Subject.class}, new DynamicProxyHandler(real));
        proxy.doSomthing();
    }
}

動態(tài)代理特點

  1. 不需要手動創(chuàng)建代理類,它會在運行期,通過反射機制創(chuàng)建一個實現(xiàn)了一組給定接口的新類
  2. 必須要實現(xiàn)InvocationHandler接口
  3. 接口中聲明的所有方法都被轉(zhuǎn)移到調(diào)用處理器一個集中的方法中處理(InvocationHandler.invoke)。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容