国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

設(shè)計模式—結(jié)構(gòu)型模式之代理模式

這篇具有很好參考價值的文章主要介紹了設(shè)計模式—結(jié)構(gòu)型模式之代理模式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

設(shè)計模式—結(jié)構(gòu)型模式之代理模式

代理模式(Proxy Pattern) ,給某一個對象提供一個代理,并由代理對象控制對原對象的引用,對象結(jié)構(gòu)型模式。

靜態(tài)代理

比如我們有一個直播平臺,提供了直播功能,但是如果不進(jìn)行美顏,可能就比較冷清。所以美顏功能就是我們的增強(qiáng),可以用靜態(tài)代理來實(shí)現(xiàn)。

直播接口:

/**
 * 直播接口
 */
public interface LiveBroadCastInterface {
    void liveBroadcast();
}

直播類:

/**
 * 實(shí)現(xiàn)直播接口
 */
public class SjdwzLiveBroadCast implements LiveBroadCastInterface{
    @Override
    public void liveBroadcast() {
        System.out.println("我來直播了......");
    }
}

如果沒有美顏,可能就會比較冷清;所以我們可以提供一個靜態(tài)代理,來為我們的直播進(jìn)行增強(qiáng)。

要代理的功能類要和原類型實(shí)現(xiàn)相同的接口。

public class SjdwzStaticProxy implements  LiveBroadCastInterface{
    
    private LiveBroadCastInterface liveBroadCastInterface;

    public SjdwzStaticProxy(LiveBroadCastInterface liveBroadCastInterface) {
        this.liveBroadCastInterface = liveBroadCastInterface;
    }

    @Override
    public void liveBroadcast() {
        System.out.println("這是代理的功能");
        System.out.println("美顏--------");
        System.out.println("=========原功能如下=========");
        this.liveBroadCastInterface.liveBroadcast();
    }
}

測試類如下:

public class StaticSjdwzProxyTest {
    public static void main(String[] args) {
        SjdwzStaticProxy sjdwzStaticProxy = new SjdwzStaticProxy(new SjdwzLiveBroadCast());
        sjdwzStaticProxy.liveBroadcast();
    }
}

運(yùn)行如下:

jdk動態(tài)代理

還是上面的例子,可以使用JDK的動態(tài)代理來實(shí)現(xiàn):

/**
 * 實(shí)現(xiàn)InvocationHandler的作用是為了在本類實(shí)現(xiàn)增強(qiáng)方法,
 * @param <T> 要代理對象實(shí)現(xiàn)的接口
 */
public class JdkLiveBroadCastProxy<T> implements InvocationHandler {

    //被代理對象
    private T target;

    public JdkLiveBroadCastProxy(T target) {
        this.target = target;
    }

    public static<T> T getProxy(T t){
        /**
         * ClassLoader loader, 當(dāng)前被代理對象的類加載器
         * Class<?>[] interfaces, 當(dāng)前被代理對象所實(shí)現(xiàn)的所有接口
         * InvocationHandler h,
         *  當(dāng)前被代理對象執(zhí)行目標(biāo)方法的時候我們使用h可以定義攔截增強(qiáng)方法
         */
        Object o = Proxy.newProxyInstance(
                t.getClass().getClassLoader(),
                t.getClass().getInterfaces(), //必須接口
                new JdkLiveBroadCastProxy(t));
        return (T)o;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("這是代理的一些功能======");
        System.out.println("原本的功能===========");
        //反射執(zhí)行
        Object invoke = method.invoke(this.target, args);
        System.out.println("返回值:"+invoke);
        return invoke;
    }
}

測試類如下:

public class JdkLiveBroadCastProxyTest {
    public static void main(String[] args) {
        LiveBroadCastInterface proxy = JdkLiveBroadCastProxy.getProxy(new SjdwzLiveBroadCast());
        proxy.liveBroadcast();
    }
}

運(yùn)行結(jié)果如下:

要求

JDK要求被代理對象必須有接口,因?yàn)楸仨氂薪涌诓拍芨嬖V代理有哪些方法。

cglib動態(tài)代理

我們發(fā)現(xiàn),如果使用JDK的動態(tài)代理,必須實(shí)現(xiàn)接口。cglib動態(tài)代理是不需要實(shí)現(xiàn)接口的。

首先我們在項目的pom文件中引入依賴:

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.3.0</version>
</dependency>

cglib動態(tài)代理類如下:

public class CglibProxy {

    //為任意對象創(chuàng)建代理
    public static<T> T createProxy(T t){
        //1、創(chuàng)建一個增強(qiáng)器
        Enhancer enhancer = new Enhancer();

        //2、設(shè)置要增強(qiáng)哪個個類的功能。增強(qiáng)器為這個類動態(tài)創(chuàng)建一個子類
        enhancer.setSuperclass(t.getClass());

        //3、設(shè)置回調(diào)
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object obj,
                                    Method method,  //為了能獲取到原方法的一些元數(shù)據(jù)信息
                                    Object[] args,
                                    MethodProxy proxy) throws Throwable {
                //編寫增強(qiáng)的邏輯
                System.out.println("cglib的動態(tài)代理增強(qiáng)的功能===========");
                System.out.println("原功能===========");
                //目標(biāo)方法進(jìn)行執(zhí)行
                Object invoke = proxy.invokeSuper(obj,args);
                return invoke;
            }
        });

        Object o = enhancer.create();
        return (T) o;
    }

}

測試類如下:

public class MyCglibProxyTest {
    public static void main(String[] args) {
        SjdwzLiveBroadCast proxy = CglibProxy.createProxy(new SjdwzLiveBroadCast());
        proxy.liveBroadcast();
    }
}

運(yùn)行截圖如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-746146.html

到了這里,關(guān)于設(shè)計模式—結(jié)構(gòu)型模式之代理模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++設(shè)計模式結(jié)構(gòu)型之代理模式

    一、概述 ?? ?代理模式是一種結(jié)構(gòu)型模式,在很多不同的場合具有廣泛的分類和應(yīng)用。其主要實(shí)現(xiàn)的思想是在客戶端和真正要訪問的對象之間引入一個 代理對象(間接層),于是,以往客戶端對真正對象的訪問現(xiàn)在變成了通過代理對象進(jìn)行訪問,代理對象在這里起到了一個

    2024年02月13日
    瀏覽(32)
  • 設(shè)計模式-04.01-結(jié)構(gòu)型-代理&橋接&裝飾器&適配器

    設(shè)計模式-04.01-結(jié)構(gòu)型-代理&橋接&裝飾器&適配器

    創(chuàng)建型模式比較好理解,后面的結(jié)構(gòu)型和行為型設(shè)計模式不是那么好理解。如果遇到不好理解的設(shè)計模式,我一般會在開頭舉比較簡單的Demo案例來幫助理解。 前面幾節(jié),我們講了設(shè)計模式中的創(chuàng)建型模式。創(chuàng)建型模式主要解決對象的創(chuàng)建問題,封裝復(fù)雜的創(chuàng)建過程,解耦對

    2024年02月09日
    瀏覽(24)
  • 設(shè)計模式--------結(jié)構(gòu)型模式

    設(shè)計模式--------結(jié)構(gòu)型模式

    結(jié)構(gòu)型模式描述如何將類或?qū)ο蟀茨撤N布局組成更大的結(jié)構(gòu)。它分為類結(jié)構(gòu)型模式和對象結(jié)構(gòu)型模式,前者采用繼承機(jī)制來組織接口和類,后者釆用組合或聚合來組合對象。 由于組合關(guān)系或聚合關(guān)系比繼承關(guān)系耦合度低,滿足“合成復(fù)用原則”,所以對象結(jié)構(gòu)型模式比類結(jié)構(gòu)

    2024年02月13日
    瀏覽(30)
  • 設(shè)計模式結(jié)構(gòu)型——外觀模式

    設(shè)計模式結(jié)構(gòu)型——外觀模式

    目錄 什么是外觀模式 外觀模式的實(shí)現(xiàn) 外觀模式角色 外觀模式舉例 外觀模式類圖 外觀模式代碼實(shí)現(xiàn) 外觀模式的特點(diǎn) 優(yōu)點(diǎn) 缺點(diǎn) 注意事項 應(yīng)用場景 總結(jié) ????????外觀模式(Facade Pattern):又叫作門面模式,歸屬于結(jié)構(gòu)型模式。外觀模式定義了提供了定義了一個統(tǒng)一的高層

    2024年02月16日
    瀏覽(26)
  • 結(jié)構(gòu)型設(shè)計模式——橋接模式

    結(jié)構(gòu)型設(shè)計模式——橋接模式

    橋接模式(Bridge pattern): 使用橋接模式通過將實(shí)現(xiàn)和抽象放在兩個不同的類層次中而使它們可以獨(dú)立改變。 橋接模式 (Bridge) 是一種結(jié)構(gòu)型設(shè)計模式, 可將 抽象 部分與 實(shí)現(xiàn) 部分 分離 ,使它們都可以獨(dú)立的變化。如果一個系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更

    2024年02月07日
    瀏覽(34)
  • 設(shè)計模式之結(jié)構(gòu)型模式

    設(shè)計模式之結(jié)構(gòu)型模式

    本文已收錄于專欄 《設(shè)計模式》 ??大話設(shè)計模式主要分為三部分,第一部分是創(chuàng)建型模式,第二部分是結(jié)構(gòu)型模式,第三部分是行為型模式。至于為什么要分為這三部分,我的理解是創(chuàng)建型是用于創(chuàng)建對象的而結(jié)構(gòu)型是發(fā)生在類與類之間的關(guān)系是比較宏觀的,比如說組合

    2024年02月11日
    瀏覽(24)
  • 結(jié)構(gòu)型設(shè)計模式——外觀模式

    結(jié)構(gòu)型設(shè)計模式——外觀模式

    有句話說這個世界就是個草臺班子,只不過排面做的好看而已,里面都是一包糠。這句話來形容外觀模式非常準(zhǔn)確,外觀模式又叫門面模式,顧名思義一個系統(tǒng)我不管你里面有多復(fù)雜有多少屎山代碼,我只要求你提供的接口好用,簡單就行,即門面要有排面!用專業(yè)的話講是

    2024年01月22日
    瀏覽(29)
  • 設(shè)計模式之橋接模式【結(jié)構(gòu)型模式】

    設(shè)計模式之橋接模式【結(jié)構(gòu)型模式】

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 學(xué)習(xí)的最大理由是想擺脫平庸,早一天就多一份人生的精彩;遲一天就多一天平庸的困擾。各位小伙伴,如果您: 想系統(tǒng)/深入學(xué)習(xí)某技術(shù)知識點(diǎn)… 一個人摸索學(xué)習(xí)很難堅持,想組團(tuán)高效學(xué)習(xí)… 想寫博

    2024年01月25日
    瀏覽(26)
  • 設(shè)計模式-結(jié)構(gòu)型模式之橋接模式

    設(shè)計模式-結(jié)構(gòu)型模式之橋接模式

    設(shè)想如果要繪制矩形、圓形、橢圓、正方形,我們至少需要4個形狀類,但是如果繪制的圖形需要具有不同的顏色,如紅色、綠色、藍(lán)色等,此時至少有如下兩種設(shè)計方案: 第一種設(shè)計方案是為每一種形狀都提供一套各種顏色的版本。 第二種設(shè)計方案是根據(jù)實(shí)際需要對形狀和

    2023年04月18日
    瀏覽(28)
  • 設(shè)計模式—結(jié)構(gòu)型模式之橋接模式

    將抽象與實(shí)現(xiàn)解耦,使兩者都可以獨(dú)立變化。 在現(xiàn)實(shí)生活中,某些類具有兩個或多個維度的變化,如圖形既可按形狀分,又可按顏色分。如何設(shè)計類似于 Photoshop 這樣的軟件,能畫不同形狀和不同顏色的圖形呢?如果用繼承方式,m 種形狀和 n 種顏色的圖形就有 m×n 種,不但

    2024年02月05日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包