設(shè)計(jì)模式之代理模式

代理模式

靜態(tài)代理

public interface Subject{
    void doSomething();
}
public class RealSubject implements Subject{
    @Override
    public void doSomething() {
        System.out.println( "call doSomething()" );
    }
}
public class AnotherRealSubject implements Subject{
    @Override
    public void doSomething() {
        System.out.println("call another doSomething().");
    }
}
public class TestProxy {
    public static void main(String[] args) {
        // static proxy
        new SubjectProxy().doSomething();
    }
}
// output:
// call doSomething()

動(dòng)態(tài)代理

// 動(dòng)態(tài)代理的核心,將代理類抽象出來,作為獨(dú)立邏輯
public class ProxyHandler implements InvocationHandler{

    private Object target;

    /**
     *  綁定委托對(duì)象,并返回代理類
     */
    public Object bind(Object target){
        this.target = target;
        //綁定該類實(shí)現(xiàn)的所有接口,取得代理類
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        //這里就可以進(jìn)行所謂的AOP編程了
        //在調(diào)用具體函數(shù)方法前,執(zhí)行功能處理
        result= method.invoke(target, args);
        //在調(diào)用具體函數(shù)方法后,執(zhí)行功能處理

        return result;
    }
}
public class TestProxy {
    public static void main(String[] args) {
        // dynamical proxy
        ProxyHandler proxyHandler = new ProxyHandler();
        // Object 1
        Subject subject = (Subject) proxyHandler.bind(new RealSubject());
        subject.doSomething();
        // Object 2
        Subject mocked = (Subject) proxyHandler.bind(new AnotherRealSubject());
        mocked.doSomething();
    }
}

// output:
// call doSomething()
// call doSomething()
// call another doSomething().

由上圖代碼可看到,proxy邏輯被抽象到ProxyHandler中,與業(yè)務(wù)完全解耦,業(yè)務(wù)中只需要?jiǎng)討B(tài)綁定委托對(duì)象,即可對(duì)委托對(duì)象的中的方法增強(qiáng)處理。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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