Spring(第二講之靜態(tài)代理和動(dòng)態(tài)代理)

代理

代理是英文 Proxy 翻譯過(guò)來(lái)的。我們?cè)谏钪幸?jiàn)到過(guò)的代理,例如大部分微商 , 大概最常見(jiàn)的就是朋友圈中賣面膜的同學(xué)了。

她們從廠家拿貨,然后在朋友圈中宣傳,然后賣給熟人。
image-20200601210242276.png

按理說(shuō),顧客可以直接從廠家購(gòu)買產(chǎn)品,但是現(xiàn)實(shí)生活中,很少有這樣的銷售模式。一般都是廠家委托給代理商進(jìn)行銷售,顧客跟代理商打交道,而不直接與產(chǎn)品實(shí)際生產(chǎn)者進(jìn)行關(guān)聯(lián)。

所以,代理就有一種中間人(中介)的味道。

接下來(lái),我們說(shuō)說(shuō)軟件中的代理模式。

靜態(tài)代理

我們通過(guò)一條例子 來(lái)感受下 什么是靜態(tài)代理 .

真實(shí)角色和代理角色 共同實(shí)現(xiàn) 接口 !

例如 :

真實(shí)角色 : You

代理角色 : 婚慶公司

實(shí)現(xiàn)相同的接口 : 結(jié)婚禮儀 .

public class StaticProxy {

    /**
     * 靜態(tài)代理
     * 接口
     * 1.真實(shí)角色
     * 2.代理角色
     */
    public static void main(String[] args) {
        new WeddingCompany(new You()).happyMarry();
    }
}

//接口
interface Marry {
    void happyMarry();
}

//真實(shí)角色
class You implements Marry {
    @Override
    public void happyMarry() {
        System.out.println("我和嫦娥奔月了!");
    }
}

//代理角色
class WeddingCompany implements Marry {

    //真實(shí)角色  目標(biāo)對(duì)象
    private Marry target;

    public WeddingCompany(Marry target) {
        this.target = target;
    }

    @Override
    public void happyMarry() {
        ready();
        this.target.happyMarry();
        after();
    }

    private void after() {
        System.out.println("結(jié)束");
    }

    private void ready() {
        System.out.println("忙前忙后");
    }
}

值得注意的是,代理類和被代理類應(yīng)該共同實(shí)現(xiàn)一個(gè)接口,或者是共同繼承某個(gè)類。

上面介紹的是靜態(tài)代理的內(nèi)容,為什么叫做靜態(tài)呢?因?yàn)樗念愋褪鞘孪阮A(yù)定好的,

****知道為什么要使用靜態(tài)代理**
解決代碼責(zé)任不分離的問(wèn)題,但同樣其也會(huì)帶來(lái),隨著項(xiàng)目變大,業(yè)務(wù)類多的話,導(dǎo)致代理類太多**

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

****知道為什么要使用動(dòng)態(tài)代理**
不僅可以解決碼責(zé)任不分離的問(wèn)題,彌補(bǔ)靜態(tài)代理的缺點(diǎn)
但同樣有問(wèn)題,API 不易使用,若用 Spring 的情況,配置過(guò)多**

使用 JDK 動(dòng)態(tài)代理  代理類與真實(shí)類共同實(shí)現(xiàn)相同接口
使用 CGLIB 動(dòng)態(tài)代理 代理類是繼承真實(shí)類

總結(jié)

  1. 代理分為靜態(tài)代理和動(dòng)態(tài)代理兩種。
  2. 靜態(tài)代理,代理類需要自己編寫(xiě)代碼寫(xiě)成。
  3. 動(dòng)態(tài)代理,代理類通過(guò) Proxy.newInstance() 方法生成。
  4. 不管是靜態(tài)代理還是動(dòng)態(tài)代理,代理與被代理者都要實(shí)現(xiàn)兩樣接口,它們的實(shí)質(zhì)是面向接口編程。
  5. 靜態(tài)代理和動(dòng)態(tài)代理的區(qū)別是在于要不要開(kāi)發(fā)者自己定義 Proxy 類。
  6. 動(dòng)態(tài)代理通過(guò) Proxy 動(dòng)態(tài)生成 proxy class,但是它也指定了一個(gè) InvocationHandler 的實(shí)現(xiàn)類。
  7. 代理模式本質(zhì)上的目的是為了增強(qiáng)現(xiàn)有代碼的功能。
最后編輯于
?著作權(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)容