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

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

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

代理模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,它為目標(biāo)對(duì)象提供一種代理,以控制對(duì)這個(gè)對(duì)象的訪問。代理對(duì)象在客戶端和目標(biāo)對(duì)象之間起到中介的作用,客戶端通過代理類與目標(biāo)對(duì)象進(jìn)行交互,而不是直接與目標(biāo)對(duì)象進(jìn)行交互。

代理模式的應(yīng)用場(chǎng)景非常廣泛,包括但不限于以下幾種情況:

  1. 訪問控制:當(dāng)客戶端不想或不能直接訪問某個(gè)對(duì)象時(shí),可以通過代理對(duì)象來間接訪問。例如,當(dāng)目標(biāo)對(duì)象是一個(gè)遠(yuǎn)程服務(wù)或者是一個(gè)復(fù)雜且耗時(shí)的操作時(shí),代理對(duì)象可以處理一些前置或后置的邏輯,如緩存、日志記錄或權(quán)限驗(yàn)證等。
  2. 功能增強(qiáng):代理模式可以在不修改目標(biāo)對(duì)象代碼的情況下,為目標(biāo)對(duì)象添加額外的功能。代理對(duì)象可以在調(diào)用目標(biāo)對(duì)象的方法前后添加新的邏輯,從而實(shí)現(xiàn)對(duì)目標(biāo)對(duì)象的增強(qiáng)。
  3. 安全控制:在某些情況下,直接訪問目標(biāo)對(duì)象可能存在安全風(fēng)險(xiǎn)。通過代理對(duì)象,可以對(duì)訪問進(jìn)行過濾或限制,確保只有滿足特定條件的客戶端才能訪問目標(biāo)對(duì)象。

代理模式主要分為靜態(tài)代理和動(dòng)態(tài)代理兩種類型:

  • 靜態(tài)代理:在編譯時(shí)就已經(jīng)確定了代理類、接口和被代理類的關(guān)系。這種方式需要為每個(gè)被代理類手動(dòng)編寫代理類,因此當(dāng)被代理類較多時(shí),代碼量會(huì)比較大。
  • 動(dòng)態(tài)代理:在運(yùn)行時(shí)通過反射機(jī)制動(dòng)態(tài)地創(chuàng)建代理類。這種方式不需要手動(dòng)編寫代理類,可以很方便地對(duì)代理類進(jìn)行統(tǒng)一處理。Java中的java.lang.reflect.Proxy類和CGLIB庫(kù)是實(shí)現(xiàn)動(dòng)態(tài)代理的常用工具。

代理模式的優(yōu)點(diǎn)包括:

  • 分離目標(biāo)對(duì)象與客戶端:客戶端只與代理對(duì)象交互,降低了客戶端與目標(biāo)對(duì)象之間的耦合度。
  • 增加靈活性:通過代理對(duì)象,可以靈活地控制對(duì)目標(biāo)對(duì)象的訪問,實(shí)現(xiàn)訪問控制、功能增強(qiáng)等目的。
  • 易于擴(kuò)展:可以在不修改目標(biāo)對(duì)象代碼的情況下,為目標(biāo)對(duì)象添加新的功能或行為。

好的,下面我將使用Java代碼來描述代理模式中的靜態(tài)代理和動(dòng)態(tài)代理。

靜態(tài)代理

假設(shè)我們有一個(gè)接口Subject和一個(gè)實(shí)現(xiàn)了該接口的類RealSubject,以及一個(gè)代理類ProxySubject。

// 接口定義
interface Subject {
    void request();
}

// 真實(shí)對(duì)象
class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("Called RealSubject.request()");
    }
}

// 代理對(duì)象
class ProxySubject implements Subject {
    private Subject realSubject;

    public ProxySubject(Subject realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public void request() {
        // 在調(diào)用真實(shí)對(duì)象之前,可以添加一些預(yù)處理邏輯
        System.out.println("Before calling RealSubject.request()");
        realSubject.request();
        // 在調(diào)用真實(shí)對(duì)象之后,可以添加一些后處理邏輯
        System.out.println("After calling RealSubject.request()");
    }
}

// 客戶端代碼
public class StaticProxyDemo {
    public static void main(String[] args) {
        // 創(chuàng)建真實(shí)對(duì)象
        Subject realSubject = new RealSubject();
        // 創(chuàng)建代理對(duì)象,并將真實(shí)對(duì)象傳遞給代理對(duì)象
        Subject proxySubject = new ProxySubject(realSubject);
        // 客戶端通過代理對(duì)象調(diào)用請(qǐng)求方法
        proxySubject.request();
    }
}

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

在Java中,動(dòng)態(tài)代理通常使用java.lang.reflect.Proxy類實(shí)現(xiàn)。下面是一個(gè)動(dòng)態(tài)代理的示例:

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

// 接口定義(與靜態(tài)代理中的相同)
interface Subject {
    void request();
}

// 真實(shí)對(duì)象(與靜態(tài)代理中的相同)
class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("Called RealSubject.request()");
    }
}

// 調(diào)用處理器
class DynamicProxyHandler implements InvocationHandler {
    private Object subject;

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

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 在調(diào)用真實(shí)對(duì)象之前,可以添加一些預(yù)處理邏輯
        System.out.println("Before calling method: " + method.getName());
        Object result = method.invoke(subject, args);
        // 在調(diào)用真實(shí)對(duì)象之后,可以添加一些后處理邏輯
        System.out.println("After calling method: " + method.getName());
        return result;
    }
}

// 客戶端代碼
public class DynamicProxyDemo {
    public static void main(String[] args) {
        // 創(chuàng)建真實(shí)對(duì)象
        Subject realSubject = new RealSubject();
        // 創(chuàng)建調(diào)用處理器,并將真實(shí)對(duì)象傳遞給它
        InvocationHandler handler = new DynamicProxyHandler(realSubject);
        // 使用Proxy.newProxyInstance創(chuàng)建代理對(duì)象
        Subject proxySubject = (Subject) Proxy.newProxyInstance(
                RealSubject.class.getClassLoader(),
                new Class<?>[] { Subject.class },
                handler);
        // 客戶端通過代理對(duì)象調(diào)用請(qǐng)求方法
        proxySubject.request();
    }
}

在動(dòng)態(tài)代理中,Proxy.newProxyInstance方法用于生成代理對(duì)象,它接受三個(gè)參數(shù):類加載器、代理類實(shí)現(xiàn)的接口數(shù)組以及調(diào)用處理器。調(diào)用處理器InvocationHandler負(fù)責(zé)處理代理實(shí)例上的方法調(diào)用,并決定是否以及如何調(diào)用實(shí)際對(duì)象上的方法。

需要注意的是,動(dòng)態(tài)代理只能代理接口,如果要代理類,則需要使用如CGLIB這樣的第三方庫(kù)。

這些代碼示例展示了如何在Java中實(shí)現(xiàn)靜態(tài)代理和動(dòng)態(tài)代理。靜態(tài)代理需要手動(dòng)編寫代理類,而動(dòng)態(tài)代理則通過反射機(jī)制在運(yùn)行時(shí)動(dòng)態(tài)生成代理類,提供了更大的靈活性和可擴(kuò)展性。文章來源地址http://www.zghlxwxcb.cn/news/detail-854896.html

到了這里,關(guān)于設(shè)計(jì)模式之結(jié)構(gòu)型模式---代理模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月05日
    瀏覽(27)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包