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

【設(shè)計(jì)模式】-代理模式

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

在軟件開發(fā)中,經(jīng)常遇到需要對(duì)某個(gè)對(duì)象進(jìn)行控制或者監(jiān)控的場(chǎng)景。而直接修改對(duì)象的代碼可能使代碼變得復(fù)雜且難以維護(hù)。這時(shí),使用代理模式(Proxy Pattern)可以很好地解決這個(gè)問題。

?????????代理模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,通過引入一個(gè)代理對(duì)象來替代原始對(duì)象,實(shí)現(xiàn)對(duì)原有對(duì)象的控制或擴(kuò)展。Java中的代理模式常用于實(shí)現(xiàn)日志記錄、權(quán)限控制、事務(wù)控制等功能。


原理及實(shí)現(xiàn)思路

代理模式的核心思想是通過引入代理對(duì)象作為中間層,將客戶端的請(qǐng)求轉(zhuǎn)發(fā)給真正的對(duì)象,從而實(shí)現(xiàn)對(duì)真實(shí)對(duì)象的控制。

代理模式包含三個(gè)主要角色:

  • 抽象主題(Subject):定義了代理對(duì)象和真實(shí)對(duì)象的共同接口。

  • 真實(shí)主題(RealSubject):實(shí)現(xiàn)了抽象主題接口,是真正的業(yè)務(wù)邏輯處理對(duì)象。

  • 代理主題(ProxySubject):實(shí)現(xiàn)了抽象主題接口,內(nèi)部持有一個(gè)真實(shí)主題對(duì)象的引用,通過代理對(duì)象間接調(diào)用真實(shí)對(duì)象。

實(shí)現(xiàn)代理模式的步驟如下:

  1. 創(chuàng)建抽象主題接口,定義需要代理的方法。

  2. 創(chuàng)建真實(shí)主題類,實(shí)現(xiàn)抽象主題接口,完成真正的業(yè)務(wù)邏輯。

  3. 創(chuàng)建代理主題類,實(shí)現(xiàn)抽象主題接口,持有一個(gè)真實(shí)主題對(duì)象的引用,在代理方法中調(diào)用真實(shí)主題的方法。

靜態(tài)代理

????????靜態(tài)代理是最簡(jiǎn)單的一種代理技術(shù),由程序員手動(dòng)編寫代理類來代替真實(shí)對(duì)象。靜態(tài)代理在編譯期生成代理類,在運(yùn)行時(shí)代理類不會(huì)發(fā)生變化

????????靜態(tài)代理的優(yōu)點(diǎn)是簡(jiǎn)單易懂、易于實(shí)現(xiàn),但缺點(diǎn)也顯而易見,每個(gè)代理類只能代理一個(gè)具體類,當(dāng)代理類的數(shù)量較多時(shí),會(huì)導(dǎo)致代碼冗余,并且每個(gè)代理類只能代理一個(gè)固定的類。

示例代碼如下:

// 抽象主題接口
interface Subject {
    void doSomething();
}

// 真實(shí)主題類
class RealSubject implements Subject {
    @Override
    public void doSomething() {
        System.out.println("RealSubject do something.");
    }
}

// 代理主題類
class ProxySubject implements Subject {
    private Subject realSubject;

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

    @Override
    public void doSomething() {
        // 對(duì)真實(shí)主題方法的增強(qiáng)
        System.out.println("Before do something.");
        realSubject.doSomething();
        System.out.println("After do something.");
    }
}

// 客戶端代碼
public class Client {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        ProxySubject proxySubject = new ProxySubject(realSubject);
        proxySubject.doSomething();
    }
}

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

????????動(dòng)態(tài)代理是在運(yùn)行時(shí)動(dòng)態(tài)地生成代理對(duì)象,相比于靜態(tài)代理,動(dòng)態(tài)代理更加靈活。Java中提供了兩種動(dòng)態(tài)代理的實(shí)現(xiàn)方式:基于接口的動(dòng)態(tài)代理基于類的動(dòng)態(tài)代理。

????????基于接口的動(dòng)態(tài)代理使用java.lang.reflect.Proxy類以及java.lang.reflect.InvocationHandler接口來實(shí)現(xiàn)。

????????這種方式要求被代理類實(shí)現(xiàn)一個(gè)接口,并通過代理類來間接調(diào)用真實(shí)對(duì)象的方法。

示例代碼如下:

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

// 抽象主題接口
interface Subject {
    void doSomething();
}

// 真實(shí)主題類
class RealSubject implements Subject {
    @Override
    public void doSomething() {
        System.out.println("RealSubject do something.");
    }
}

// InvocationHandler實(shí)現(xiàn)類
class MyInvocationHandler implements InvocationHandler {
    private Object realSubject;

    public MyInvocationHandler(Object realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 對(duì)真實(shí)主題方法的增強(qiáng)
        System.out.println("Before do something.");
        Object result = method.invoke(realSubject, args);
        System.out.println("After do something.");
        return result;
    }
}

// 客戶端代碼
public class Client {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        InvocationHandler handler = new MyInvocationHandler(realSubject);
        Subject proxySubject = (Subject) Proxy.newProxyInstance(
                Client.class.getClassLoader(),
                new Class[]{Subject.class},
                handler);
        proxySubject.doSomething();
    }
}

基于類的動(dòng)態(tài)代理使用cglib庫(kù),不要求被代理類實(shí)現(xiàn)接口,通過生成子類來實(shí)現(xiàn)代理。

示例代碼如下:

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

// 真實(shí)主題類
class RealSubject {
    public void doSomething() {
        System.out.println("RealSubject do something.");
    }
}

// MethodInterceptor實(shí)現(xiàn)類
class MyMethodInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        // 對(duì)真實(shí)主題方法的增強(qiáng)
        System.out.println("Before do something.");
        Object result = methodProxy.invokeSuper(object, args);
        System.out.println("After do something.");
        return result;
    }
}

// 客戶端代碼
public class Client {
    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(RealSubject.class);
        enhancer.setCallback(new MyMethodInterceptor());
        RealSubject proxySubject = (RealSubject) enhancer.create();
        proxySubject.doSomething();
    }
}

不同代理模式的優(yōu)缺點(diǎn)及適用場(chǎng)景

優(yōu)缺點(diǎn)

  • 靜態(tài)代理的優(yōu)點(diǎn)在于簡(jiǎn)單易懂、易于實(shí)現(xiàn)。缺點(diǎn)是每個(gè)代理類只能代理一個(gè)具體類,導(dǎo)致代碼冗余,不夠靈活。

  • 基于接口的動(dòng)態(tài)代理的優(yōu)點(diǎn)是可以代理實(shí)現(xiàn)了指定接口的任意對(duì)象,不需要修改原有代碼。缺點(diǎn)是只能代理接口中定義的方法。

  • 基于類的動(dòng)態(tài)代理的優(yōu)點(diǎn)是可以代理任意類的對(duì)象,不需要修改原有代碼。缺點(diǎn)是不能代理final修飾的類和方法。

適用場(chǎng)景:

  • 靜態(tài)代理適用于只需要代理少數(shù)幾個(gè)類,并且不需要頻繁地修改代理類的情況。

  • 基于接口的動(dòng)態(tài)代理適用于需要對(duì)接口中的方法進(jìn)行控制和擴(kuò)展的情況。

  • 基于類的動(dòng)態(tài)代理適用于不需要修改原有代碼、對(duì)類的任意方法進(jìn)行控制和擴(kuò)展的情況。文章來源地址http://www.zghlxwxcb.cn/news/detail-638077.html

到了這里,關(guān)于【設(shè)計(jì)模式】-代理模式的文章就介紹完了。如果您還想了解更多內(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)文章

  • Java設(shè)計(jì)模式---單例 工廠 代理模式

    單例模式是設(shè)計(jì)模式中的一種,屬于創(chuàng)建型模式。在軟件工程中,單例模式確保一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)全局訪問點(diǎn)。這種模式常用于那些需要頻繁實(shí)例化然后引用,且創(chuàng)建新實(shí)例的開銷較大的類,例如數(shù)據(jù)庫(kù)連接池、緩存管理等。 意圖 :保證一個(gè)類僅有一個(gè)實(shí)例

    2024年01月24日
    瀏覽(28)
  • Java設(shè)計(jì)模式中的代理模式

    Java設(shè)計(jì)模式中的代理模式 代理模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,它提供了一個(gè)代理對(duì)象,以控制對(duì)其他對(duì)象的訪問。代理可以充當(dāng)中介,用于控制對(duì)真實(shí)對(duì)象的訪問。 代碼舉例演示 靜態(tài)代理: 動(dòng)態(tài)代理 區(qū)別: 靜態(tài)代理: 代理類在編譯時(shí)就已經(jīng)確定,并且需要為每個(gè)被代理的

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

    代理模式(Proxy Pattern)是一種結(jié)構(gòu)型設(shè)計(jì)模式, 它允許通過一個(gè)代理對(duì)象控制對(duì)其他對(duì)象的訪問 。代理模式在訪問對(duì)象時(shí)引入了一定程度的間接性,使得可以在訪問對(duì)象前后進(jìn)行一些額外的操作。在本文中,我們將深入研究Java中代理模式的定義、結(jié)構(gòu)、使用場(chǎng)景以及如何在

    2024年01月21日
    瀏覽(23)
  • Java設(shè)計(jì)模式之代理模式--經(jīng)紀(jì)人的工作

    Java設(shè)計(jì)模式之代理模式--經(jīng)紀(jì)人的工作

    本文主要講述 代理模式 ,文中使用通俗易懂的案例,使你更好的學(xué)習(xí)本章知識(shí)點(diǎn)并理解原理,做到有道無術(shù)。 代理模式是23種設(shè)計(jì)模式中 結(jié)構(gòu)型模式 的一種,它的核心是通過代理類來完成其他對(duì)象的訪問,降低訪問者和被訪問者的耦合度,也對(duì)功能進(jìn)行了增強(qiáng)。 每個(gè)藝人

    2024年02月09日
    瀏覽(25)
  • Java復(fù)習(xí)-20-接口(3)- 代理設(shè)計(jì)模式

    Java復(fù)習(xí)-20-接口(3)- 代理設(shè)計(jì)模式

    功能:可以幫助用戶將所有的開發(fā)注意力只集中在核心業(yè)務(wù)功能的處理上。 代理模式(Proxy Pattern)是一種結(jié)構(gòu)性模式。代理模式為一個(gè)對(duì)象提供了一個(gè)替身,以控制對(duì)這個(gè)對(duì)象的訪問。即通過代理對(duì)象訪問目標(biāo)目標(biāo)對(duì)象,可以在目標(biāo)對(duì)象實(shí)現(xiàn)的基礎(chǔ)上,增強(qiáng)額外的功能操作,即

    2024年02月09日
    瀏覽(17)
  • Java 設(shè)計(jì)者模式以及與Spring關(guān)系(四) 代理模式

    Java 設(shè)計(jì)者模式以及與Spring關(guān)系(四) 代理模式

    目錄 簡(jiǎn)介: 23設(shè)計(jì)者模式以及重點(diǎn)模式 代理模式(Proxy Pattern) 靜態(tài)代理示例 spring中應(yīng)用 動(dòng)態(tài)代理 1.基于JDK的動(dòng)態(tài)代理 target.getClass().getInterfaces()作用 內(nèi)名內(nèi)部類寫法(更簡(jiǎn)潔,但不推薦) 2.基于CGLIB實(shí)現(xiàn) spring中應(yīng)用 本文是個(gè)系列一次會(huì)出兩個(gè)設(shè)計(jì)者模式作用,如果有關(guān)聯(lián)就三

    2024年01月23日
    瀏覽(92)
  • JAVA設(shè)計(jì)模式6:代理模式,用于控制對(duì)目標(biāo)對(duì)象的訪問

    JAVA設(shè)計(jì)模式6:代理模式,用于控制對(duì)目標(biāo)對(duì)象的訪問

    作者主頁(yè) :Designer 小鄭 作者簡(jiǎn)介 :3年JAVA全棧開發(fā)經(jīng)驗(yàn),專注JAVA技術(shù)、系統(tǒng)定制、遠(yuǎn)程指導(dǎo),致力于企業(yè)數(shù)字化轉(zhuǎn)型,CSDN博客專家,阿里云社區(qū)專家博主,藍(lán)橋云課講師。 代理模式是一種常用的設(shè)計(jì)模式,它提供了一個(gè)代理對(duì)象,用于控制對(duì)目標(biāo)對(duì)象的訪問 。 在代理模式

    2024年02月07日
    瀏覽(27)
  • 【設(shè)計(jì)模式——學(xué)習(xí)筆記】23種設(shè)計(jì)模式——代理模式Proxy(原理講解+應(yīng)用場(chǎng)景介紹+案例介紹+Java代碼實(shí)現(xiàn))

    【設(shè)計(jì)模式——學(xué)習(xí)筆記】23種設(shè)計(jì)模式——代理模式Proxy(原理講解+應(yīng)用場(chǎng)景介紹+案例介紹+Java代碼實(shí)現(xiàn))

    代理模式 為一個(gè)對(duì)象提供一個(gè)代理對(duì)象,以控制對(duì)這個(gè)對(duì)象的訪問 。即通過代理對(duì)象訪問目標(biāo)對(duì)象,這樣做的好處是:可以在不修改目標(biāo)對(duì)象代碼的基礎(chǔ)上,增強(qiáng)額外的功能操作,即擴(kuò)展目標(biāo)對(duì)象的功能 被代理的對(duì)象可以是遠(yuǎn)程對(duì)象、創(chuàng)建開銷大的對(duì)象或需要安全控制的對(duì)

    2024年02月14日
    瀏覽(59)
  • 【Java面試題】設(shè)計(jì)模式之七種結(jié)構(gòu)性模式——代理模式、適配器模式、橋接模式、裝飾模式、外觀模式、享元模式、組合模式

    目錄 一、代理模式 二、適配器模式 三、橋接模式 四、裝飾模式 五、外觀模式 六、享元模式 七、組合模式 概念: 代理模式是為其他對(duì)象提供一種以代理控制對(duì)這個(gè)對(duì)象的訪問。在某些情況下,一個(gè)對(duì)象不適合或者不能直接引用另一個(gè)對(duì)象,而代理對(duì)象可以在客戶端和目標(biāo)對(duì)

    2023年04月09日
    瀏覽(26)
  • 【Java基礎(chǔ)教程】(十五)面向?qū)ο笃?· 第九講:抽象類和接口——定義、限制與應(yīng)用的細(xì)節(jié),初窺模板設(shè)計(jì)模式、工廠設(shè)計(jì)模式與代理設(shè)計(jì)模式~

    【Java基礎(chǔ)教程】(十五)面向?qū)ο笃?· 第九講:抽象類和接口——定義、限制與應(yīng)用的細(xì)節(jié),初窺模板設(shè)計(jì)模式、工廠設(shè)計(jì)模式與代理設(shè)計(jì)模式~

    掌握 抽象類和接口的定義、使用、區(qū)別、常見設(shè)計(jì)模式; 抽象類是代碼開發(fā)中的重要組成部分,利用抽象類可以明確地定義子類需要覆寫的方法,這樣相當(dāng)于在語(yǔ)法程度上對(duì)子類進(jìn)行了嚴(yán)格的定義限制,代碼的開發(fā)也就更加標(biāo)準(zhǔn)。下面具體介紹抽象類的概念。 普通類可以直

    2024年02月16日
    瀏覽(26)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包