代理模式

本文參考自:http://www.cnblogs.com/qifengshi/p/6566752.html

1. 作用

代理模式是Java常見(jiàn)的設(shè)計(jì)模式之一。所謂代理模式是指客戶端并不直接調(diào)用實(shí)際的對(duì)象,而是通過(guò)調(diào)用代理,來(lái)間接的調(diào)用實(shí)際的對(duì)象。
為什么要采用這種間接的形式來(lái)調(diào)用對(duì)象呢?一般是因?yàn)榭蛻舳瞬幌胫苯釉L問(wèn)實(shí)際的對(duì)象,或者訪問(wèn)實(shí)際的對(duì)象存在困難,因此通過(guò)一個(gè)代理對(duì)象來(lái)完成間接的訪問(wèn)。

2. 結(jié)構(gòu)
代理模式結(jié)構(gòu)

代理模式中的角色

  • 統(tǒng)一的抽象類Subject
    上層統(tǒng)一的接口或抽象類
  • 實(shí)際的實(shí)現(xiàn)類RealSubject
    具體的實(shí)現(xiàn)類
  • RealSubject的代理類ProxySubject
    具體實(shí)現(xiàn)類的代理類
3. 實(shí)現(xiàn)

代理模式有兩種實(shí)現(xiàn)方法,靜態(tài)代理和動(dòng)態(tài)代理。

靜態(tài)代理
Subject類

public interface Subject {
    void visit();
}

RealSubject類

public class RealSubject implements Subject{

    @Override
    public void visit() {
        System.out.println("this is real subject");
    }
}

代理類

public class ProxySubject implements Subject{

    private RealSubject realSubject;
    
    public ProxySubject(RealSubject realSubject) {
        this.realSubject = realSubject;
    }
    @Override
    public void visit() {
        realSubject.visit();
    }
}

客戶端類

public class StaticProxyPatternMain {

    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        ProxySubject proxySubject = new ProxySubject(realSubject);
        proxySubject.visit();
    }
}

動(dòng)態(tài)代理
動(dòng)態(tài)代理在代理類的構(gòu)建和代理類對(duì)象創(chuàng)建的過(guò)程中與靜態(tài)代理不同,具體如下。
Subject類

public interface Subject {
    void visit();
}

RealSubject類

public class RealSubject implements Subject{

    @Override
    public void visit() {
        System.out.println("this is real subject");
    }
}

代理類
代理類需要實(shí)現(xiàn)InnovationHandler接口,并實(shí)現(xiàn)invoke方法,構(gòu)造函數(shù)中傳入的對(duì)象就對(duì)應(yīng)著具體實(shí)現(xiàn)類(RealSubject)的對(duì)象

public class ProxySubject implements InvocationHandler{

    private Object object;
    
    public ProxySubject(Object object) {
        this.object = object;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(object, args);
        return result;
    }

    
}

客戶端類

三個(gè)參數(shù)的含義
ClassLoader loader表示當(dāng)前使用到的appClassloader。
Class<?>[] interfaces表示目標(biāo)對(duì)象實(shí)現(xiàn)的一組接口。
InvocationHandler h表示當(dāng)前的InvocationHandler實(shí)現(xiàn)實(shí)例對(duì)象。

public class DynamicProxyPatternMain {

    public static void main(String[] args) {
        //創(chuàng)建RealSubject
        RealSubject realSubject = new RealSubject();
        //創(chuàng)建代理類,傳入RealSubject對(duì)象
        ProxySubject proxySubject = new ProxySubject(realSubject);
        //獲取實(shí)現(xiàn)對(duì)象的ClassLoader
        ClassLoader classLoader = realSubject.getClass().getClassLoader();
        /**
         * 用Proxy.newProxyInstance創(chuàng)建代理類對(duì)象
         * 三個(gè)參數(shù)對(duì)應(yīng)的是
         * 具體實(shí)現(xiàn)類的ClassLoader
         * 一個(gè)Class數(shù)組,數(shù)組中傳入抽象類的class對(duì)象
         * ProxySubject對(duì)象
         */
        Subject subject =(Subject) Proxy.newProxyInstance(classLoader, new Class[] {Subject.class}, proxySubject);
        
        subject.visit();
    }
}
最后編輯于
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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