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

Java代理模式——靜態(tài)代理與動(dòng)態(tài)代理

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

代理模式

代理模式允許你為其他對(duì)象提供一個(gè)代理,以控制對(duì)這個(gè)對(duì)象的訪問。代理模式在不改變實(shí)際對(duì)象的情況下,可以在訪問對(duì)象時(shí)添加額外的功能。

可以理解為代理模式為被代理對(duì)象創(chuàng)造了一個(gè)替身,調(diào)用者可以通過這個(gè)替身去實(shí)現(xiàn)這個(gè)被代理對(duì)象的功能,這個(gè)替身也可以為被代理對(duì)象增加功能

靜態(tài)代理

定義

使用時(shí)候需要定義接口或者父類。 代理類和委托類有共同的父類或父接口。

案例

首先定義一個(gè)接口?ITeacherDao,并在這個(gè)接口中定義一個(gè)teacher()方法。

package Static;

public interface ITeacherDao {
    void teacher();
}

再寫一個(gè)他的實(shí)現(xiàn)類,實(shí)現(xiàn)teacher()方法

package Static;

public class TeacherDao implements ITeacherDao{
    @Override
    public void teacher() {
        System.out.println("老師在教課");
    }
}

?如上,我們實(shí)現(xiàn)了一個(gè)簡(jiǎn)單接口與他的實(shí)現(xiàn)類,接下來我們實(shí)現(xiàn)一個(gè)老師的靜態(tài)代理類

package Static;

public class TeacherDaoProxy implements ITeacherDao{

    private TeacherDao teacherDao;

    public TeacherDaoProxy(TeacherDao teacherDao){
        this.teacherDao = teacherDao;
    }
    @Override
    public void teacher() {
        System.out.println("代理前");
        teacherDao.teacher();
        System.out.println("代理后");
    }
}

在這段代碼中,我們實(shí)現(xiàn)了TeacherDao的代理類,并通過調(diào)用teacherDao這個(gè)對(duì)象使用了被代理對(duì)象的方法;我們?cè)谑褂帽淮韺?duì)象方法前后都拓展了新的功能,這就是靜態(tài)代理。

下面是主函數(shù)對(duì)于靜態(tài)代理的使用

public class Main {
    public static void main(String[] args) {
        Static.TeacherDao teacherDao = new TeacherDao();

        TeacherDaoProxy teacherDaoProxy = new TeacherDaoProxy(teacherDao);

        teacherDaoProxy.teacher();
    }
}

Java代理模式——靜態(tài)代理與動(dòng)態(tài)代理,代理模式,java,設(shè)計(jì)模式,反射

?這說明我們的代理類在實(shí)現(xiàn)被代理對(duì)象的功能時(shí)也拓展了新的功能

但是,這樣的模式也存在一種缺陷,就是我們的代理對(duì)象和被調(diào)用對(duì)象都要實(shí)現(xiàn)同一接口或父類,可能會(huì)出現(xiàn)多個(gè)代理類,接口如果要增加方法的話會(huì)有很多代理類需要維護(hù);針對(duì)這一問題,Java的開發(fā)者定義了相關(guān)方法去解決,這就是我們下面要介紹的被代理類。

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

定義

不需要實(shí)現(xiàn)接口,但是被代理的目標(biāo)對(duì)象需要實(shí)現(xiàn),調(diào)用jdk的api形成代理對(duì)象,

動(dòng)態(tài)代理就是通過使用反射,動(dòng)態(tài)地獲取抽象接口的類型,從而獲取相關(guān)特性進(jìn)行代理。

案例

我們還是先定義一個(gè)接口

public interface ITeacherDao {
    void teacher();
    void sayhello();
}

接著我們定義他的實(shí)現(xiàn)類

public class TeacherDao implements ITeacherDao {
    @Override
    public void teacher() {
        System.out.println("老師在教課");
    }

    @Override
    public void sayhello() {
        System.out.println("hello");
    }
}

接著我們實(shí)現(xiàn)一個(gè)動(dòng)態(tài)的代理類,可以動(dòng)態(tài)代理原對(duì)象;在這個(gè)代理類中,我們使用到了Proxy.newProxyInstance 這個(gè)函數(shù),他有三個(gè)參數(shù),以下是三個(gè)參數(shù)的解釋

1.target.getClass().getClassLoader():獲取被代理對(duì)象的類加載器。這是用于加載代理類的類加載器。

2.target.getClass().getInterfaces():獲取被代理對(duì)象實(shí)現(xiàn)的接口。這些接口是代理類將要實(shí)現(xiàn)的接口。

3.new InvocationHandler() { ... }:創(chuàng)建一個(gè)匿名的 InvocationHandler 對(duì)象,它實(shí)現(xiàn)了 invoke 方法,這是代理邏輯的核心部分。

?我們?cè)?code>InvocationHandler() { ... }中調(diào)用了被代理對(duì)象的方法,并且做了一些擴(kuò)展

public class FactoryProxy  {
    private Object target;

    public FactoryProxy(Object target){
        this.target = target;
    }

    public Object getProxyIstance() {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("代理前");
                Object returnVal = method.invoke(target,args);
                System.out.println("代理后");

                return returnVal;
            }
        });
    };
}

在主函數(shù)中調(diào)用被代理類,創(chuàng)建一個(gè)接口類,講接口類傳入被代理類,然后就可以定義接口類中的方法了,即實(shí)現(xiàn)了動(dòng)態(tài)代理。

public class Main {
    public static void main(String[] args) {
        ITeacherDao iteacherDao = new TeacherDao();

        ITeacherDao proxyInstance = (ITeacherDao) new FactoryProxy(iteacherDao).getProxyIstance();

        proxyInstance.teacher();
        proxyInstance.sayhello();

    }
}

最終輸出結(jié)果

Java代理模式——靜態(tài)代理與動(dòng)態(tài)代理,代理模式,java,設(shè)計(jì)模式,反射

?可以看出,我們通過動(dòng)態(tài)代理類實(shí)現(xiàn)了對(duì)目標(biāo)對(duì)象的功能拓展

鏈接

java靜態(tài)代理與動(dòng)態(tài)代理: java靜態(tài)代理與動(dòng)態(tài)代理文章來源地址http://www.zghlxwxcb.cn/news/detail-646275.html

到了這里,關(guān)于Java代理模式——靜態(tài)代理與動(dòng)態(tài)代理的文章就介紹完了。如果您還想了解更多內(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ì)模式(十三)代理模式

    一、概述 代理模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,它提供了一個(gè)代理對(duì)象,充當(dāng)被代理對(duì)象的接口,以控制對(duì)被代理對(duì)象的訪問。代理模式可以在不修改被代理對(duì)象的情況下,增加額外的功能或控制訪問方式。 二、代碼 以下是一個(gè)示例代碼,說明代理模式的使用: 在上述代碼中,

    2024年02月04日
    瀏覽(24)
  • 【Java設(shè)計(jì)模式005】代理模式

    由于一些特定原因某些對(duì)象不適合或者不能直接引用目標(biāo)對(duì)象,這時(shí)就可以使用代理模式。代理模式為目標(biāo)對(duì)象提供一個(gè)代理以控制訪問對(duì)象對(duì)目標(biāo)對(duì)象的訪問??蛻舳酥荒苤苯釉L問代理對(duì)象,不能直接訪問目標(biāo)對(duì)象,這么做確保了目標(biāo)對(duì)象的安全。生活中一個(gè)常見的例子就

    2024年02月12日
    瀏覽(20)
  • Java 代理模式詳解,靜態(tài)代理與動(dòng)態(tài)代理的區(qū)別及優(yōu)缺點(diǎn)

    代理模式是一種常用的設(shè)計(jì)模式,它允許通過引入一個(gè)代理對(duì)象來控制對(duì)目標(biāo)對(duì)象的訪問。在Java中,代理模式被廣泛應(yīng)用,它可以提供額外的功能,如權(quán)限檢查、緩存、日志記錄等,同時(shí)還能在不修改目標(biāo)對(duì)象的情況下對(duì)其進(jìn)行擴(kuò)展。 代理模式(Proxy Pattern)是指通過代理對(duì)象

    2024年02月11日
    瀏覽(27)
  • 設(shè)計(jì)模式-簡(jiǎn)單工廠模式(靜態(tài)工廠模式)java實(shí)現(xiàn)

    設(shè)計(jì)模式-簡(jiǎn)單工廠模式(靜態(tài)工廠模式)java實(shí)現(xiàn)

    簡(jiǎn)單工廠模式根據(jù)所 提供的參數(shù) 數(shù)據(jù)返回幾個(gè)可能類中的一個(gè)類的實(shí)例。通常返回的類都有一個(gè)公共的父類和公共的方法。 ? 意圖 提供一個(gè)類,負(fù)責(zé)根據(jù)一定的條件創(chuàng)建某一具體類的實(shí)例。同時(shí)使用工廠模式也是為了隱藏創(chuàng)建對(duì)象的過程 角色及其職責(zé) (1)工廠(Creator)角色

    2024年02月13日
    瀏覽(29)
  • Java 與設(shè)計(jì)模式(13):代理模式

    代理模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,用于在訪問對(duì)象時(shí)引入一個(gè)代理對(duì)象,以控制對(duì)實(shí)際對(duì)象的訪問。代理對(duì)象充當(dāng)了客戶端和實(shí)際對(duì)象之間的中介,客戶端通過代理對(duì)象間接地訪問實(shí)際對(duì)象,從而可以在訪問過程中添加額外的邏輯或控制。代理模式可以提供對(duì)實(shí)際對(duì)象的保護(hù)

    2024年02月09日
    瀏覽(19)
  • 基于Java的設(shè)計(jì)模式 - 代理模式

    代理模式是一種使用代理對(duì)象來執(zhí)行目標(biāo)對(duì)象的方法并在代理對(duì)象中增強(qiáng)目標(biāo)對(duì)象方法的一種設(shè)計(jì)模式。簡(jiǎn)單來講就是在不修改目標(biāo)對(duì)象的基礎(chǔ)上,增強(qiáng)主業(yè)務(wù)邏輯的設(shè)計(jì)模式。 代理模式基本可分為三種 靜態(tài)代理 JDK動(dòng)態(tài)代理 CGLIB動(dòng)態(tài)代理 上述簡(jiǎn)單分就是靜態(tài)和動(dòng)態(tài)代理,靜

    2024年02月07日
    瀏覽(21)
  • 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日
    瀏覽(29)
  • 設(shè)計(jì)模式8:代理模式-靜態(tài)代理

    我嘗試在JDK、Android SDK和一些出名的庫(kù)中,尋找靜態(tài)代理的源碼,沒能找到。如果有讀者發(fā)現(xiàn),歡迎評(píng)論或者私信我。 1. 售票代理 售票服務(wù) 站點(diǎn)售票 代理網(wǎng)點(diǎn)售票 2. 明星代理

    2024年02月11日
    瀏覽(24)
  • 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)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包