最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計模式之代理模式解析

 更新時間:2023年12月18日 09:00:26   作者:暴躁的程序猿啊  
這篇文章主要介紹了Java設(shè)計模式之代理模式解析,代理模式為一個對象提供一個替身,以控制對這個對象的訪問,即通過代理對象訪問目標(biāo)對象,需要的朋友可以參考下

代理模式(Proxy)

代理模式的基本介紹

1.代理模式:為一個對象提供一個替身,以控制對這個對象的訪問,即通過代理對象訪問目標(biāo)對象…這樣做的好處是:可以在目標(biāo)對象實現(xiàn)的基礎(chǔ)上,增強額外的功能操作,即擴展目標(biāo)對象的功能

2.被代理對象可以使遠程對象、創(chuàng)建開銷大的對象或需要安全控制的對象

3.代理模式有不同的形式,主要有三種靜態(tài)代理、動態(tài)代理(JDK代理、接口代理)、和cglib代理(可以在內(nèi)存中動態(tài)的創(chuàng)建對象,而不需要實現(xiàn)接口,它是屬于動態(tài)代理的范疇)

靜態(tài)代理

靜態(tài)代理在使用時,需要定義接口或者父類,被代理對象(即目標(biāo)對象)與代理對象一起實現(xiàn)相同的接口或者是繼承相同父類

應(yīng)用實例

1、定義一個接口ITeacherDao

2.目標(biāo)對象TeacherDao實現(xiàn)ITeacherDao

3.使用靜態(tài)代理方式,就需要在代理對象TeacherDaoProxy中也實現(xiàn)ITeacherDao

4.調(diào)用的時候通過調(diào)用代理對象的方法來調(diào)用目標(biāo)對象

5.特別提醒:代理對象與目標(biāo)對象要實現(xiàn)相同的接口,然后通過調(diào)用相同的方法來 調(diào)用目標(biāo)對象方法

接口

/**
 * 接口
 */
public interface ITeacherDao {
    /**
     * 授課的方法
     */
    void teach();
}

接口實現(xiàn)

/**
 * @create: 2021/10/6
 * @author: Tony Stark
 */
public class TeacherDao implements ITeacherDao {
    @Override
    public void teach() {
        System.out.println("老師授課中......");
    }
}

代理類實現(xiàn)接口

/**
 * 代理類  靜態(tài)代理
 * @create: 2021/10/6
 * @author: Tony Stark
 */
public class TeacherDaoProxy implements ITeacherDao {
    /**
     *目標(biāo)對象通過接口來聚合
     */
    private ITeacherDao target;
    /**
     * 構(gòu)造器  構(gòu)建TeacherDaoProxy對象是傳進來一個接口 (實現(xiàn)了接口的具體子類對象)
     * @param target
     */
    public TeacherDaoProxy(ITeacherDao target) {
        this.target = target;
    }
    @Override
    public void teach() {
        //加入增強的方法
        System.out.println("代理開始  完成一些操作.......");
        //執(zhí)行代理類的方法
        target.teach();
        //增強的步驟
        System.out.println("提交操作  代理結(jié)束.......");
    }
}

調(diào)用

/**
 * @create: 2021/10/6
 * @author: Tony Stark
 */
public class Client {
    public static void main(String[] args) {
        //被代理的對象
        TeacherDao teacherDao = new TeacherDao();
        //代理對象   把背代理對象傳給代理對象
        TeacherDaoProxy teacherDaoProxy = new TeacherDaoProxy(teacherDao);
        //通過代理對象執(zhí)行方法
        teacherDaoProxy.teach();
    }
}

輸出

代理開始  完成一些操作.......
老師授課中......
提交操作  代理結(jié)束.......

靜態(tài)代理優(yōu)缺點:

1.優(yōu)點:在不修改目標(biāo)對象的功能的前提下,能通過代理對象對目標(biāo)功能擴展

2.缺點:因為代理對象需要與目標(biāo)對象實現(xiàn)一樣的接口,所以會有很多代理類

3.一旦接口增加方法 就要修改所有

動態(tài)代理

1.動態(tài)代理,不需要實現(xiàn)接口,但是目標(biāo)對象要實現(xiàn)接口,否則不能用動態(tài)代理

2.代理對象的生成,是利用JDK的API,動態(tài)的在內(nèi)存中構(gòu)建代理對象

3.動態(tài)代理也叫做:JDK代理、接口代理

JDK中生成代理對象API

1.代理類所在包:java.lang.reflect.Proxy

2.JDK實現(xiàn)代理只需要使用newProxyInstance方法,但是該方法需要接收三個參數(shù),完整的寫法是

static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

我們把上面的靜態(tài)代理改成動態(tài)代理

在這里插入圖片描述

接口

/**
 * 接口
 */
public interface ITeacherDao {
    /**
     * 授課的方法
     */
    void teach();
}

實現(xiàn)類

/**
 * @create: 2021/10/6
 * @author: Tony Stark
 */
public class TeacherDao implements ITeacherDao {
    @Override
    public void teach() {
        System.out.println("老師正在授課...");
    }
}

代理

/**
 * @create: 2021/10/6
 * @author: Tony Stark
 */
public class ProxyFactory  {
    /**
     *維護一個目標(biāo)對象
     */
    private Object target;
    /**
     * 構(gòu)造器對target進行初始化
     * @param target
     */
    public ProxyFactory(Object target) {
        this.target = target;
    }
    /**
     * 給目標(biāo)對象生成一個代理對象
     * @return
     */
    public Object getProxyInstance(){
        //參數(shù)說明:
        //ClassLoader loader   指定當(dāng)前目標(biāo)對象使用的類加載器  獲取加載器的方法固定
        //Class<?>[] interfaces  目標(biāo)對象(被代理對象)的接口類型  使用泛型的方式確認類型
        //target.getClass().getInterfaces()獲取所有接口
        //InvocationHandler h  事件處理,執(zhí)行目標(biāo)對象方法時
        // 會觸發(fā)事件處理器的方法,會把當(dāng)前執(zhí)行的目標(biāo)對象方法作為參數(shù)傳入
       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("JDK代理開始");
               //通過反射調(diào)用目標(biāo)對象的方法
               Object invoke = method.invoke(target, args);
               return invoke;
           }
       });
    }
}

調(diào)用測試

   /**
     * @create: 2021/10/6
     * @author: Tony Stark
     */
    public class Client {
        public static void main(String[] args) {
            //創(chuàng)建目標(biāo)對象
            ITeacherDao target = new TeacherDao();
            //給目標(biāo)對象創(chuàng)建代理對象
            ProxyFactory proxyFactory = new ProxyFactory(target);
            //返回的是代理對象 一個Object  可以強轉(zhuǎn)成ITeacherDao  不強轉(zhuǎn)調(diào)不了方法
            ITeacherDao proxyInstance = (ITeacherDao) proxyFactory.getProxyInstance();
            //從這里可以看出內(nèi)存中動態(tài)生成了代理對象 class com.sun.proxy.$Proxy0
            System.out.println(proxyInstance.getClass());
            proxyInstance.teach();
        }
    }

輸出

class com.sun.proxy.$Proxy0
JDK代理開始
老師正在授課...

到此這篇關(guān)于Java設(shè)計模式之代理模式解析的文章就介紹到這了,更多相關(guān)Java代理模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實現(xiàn)附件預(yù)覽(openoffice+swftools+flexpaper)實例

    java實現(xiàn)附件預(yù)覽(openoffice+swftools+flexpaper)實例

    本篇文章主要介紹了java實現(xiàn)附件預(yù)覽(openoffice+swftools+flexpaper)實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-10-10
  • Java源文件命名規(guī)則詳解

    Java源文件命名規(guī)則詳解

    這篇文章主要介紹了Java源文件命名規(guī)則,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 基于logback.xml不生效問題的解決

    基于logback.xml不生效問題的解決

    這篇文章主要介紹了基于logback.xml不生效問題的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java異常Exception詳細講解

    Java異常Exception詳細講解

    異常就是不正常,比如當(dāng)我們身體出現(xiàn)了異常我們會根據(jù)身體情況選擇喝開水、吃藥、看病、等?異常處理方法。?java異常處理機制是我們java語言使用異常處理機制為程序提供了錯誤處理的能力,程序出現(xiàn)的錯誤,程序可以安全的退出,以保證程序正常的運行等
    2022-07-07
  • Spring Cloud Zuul的重試配置詳解

    Spring Cloud Zuul的重試配置詳解

    這篇文章主要介紹了Spring Cloud Zuul的重試配置詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • java配置數(shù)據(jù)庫連接池的方法步驟

    java配置數(shù)據(jù)庫連接池的方法步驟

    java配置數(shù)據(jù)庫連接池的方法步驟,需要的朋友可以參考一下
    2013-05-05
  • Springboot集成Tika實現(xiàn)文檔解析

    Springboot集成Tika實現(xiàn)文檔解析

    Tika是一款A(yù)pache開源的,跨平臺,支持多品種文本類型的內(nèi)容檢測和提取工具,本文將介紹Springboot如何集成Tika實現(xiàn)文檔解析,需要的可以參考下
    2024-11-11
  • 使用Java獲取文件樹的代碼實現(xiàn)

    使用Java獲取文件樹的代碼實現(xiàn)

    Java語言提供了豐富的庫和工具,使得我們可以方便地獲取和操作Java文件的語法樹(AST, Abstract Syntax Tree),在這篇博客中,我們將探討如何使用Java來獲取一個Java文件的語法樹,并展示詳細的代碼示例和運行結(jié)果,需要的朋友可以參考下
    2024-08-08
  • java中使用雪花算法(Snowflake)為分布式系統(tǒng)生成全局唯一ID代碼示例

    java中使用雪花算法(Snowflake)為分布式系統(tǒng)生成全局唯一ID代碼示例

    Java雪花算法是一種用于生成唯一ID的算法,它可以在分布式系統(tǒng)中生成全局唯一的ID,這篇文章主要給大家介紹了關(guān)于java中使用雪花算法(Snowflake)為分布式系統(tǒng)生成全局唯一ID的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • Java concurrency之共享鎖和ReentrantReadWriteLock_動力節(jié)點Java學(xué)院整理

    Java concurrency之共享鎖和ReentrantReadWriteLock_動力節(jié)點Java學(xué)院整理

    本篇文章主要介紹了Java concurrency之共享鎖和ReentrantReadWriteLock,非常具有實用價值,需要的朋友可以參考下
    2017-06-06

最新評論

西林县| 永顺县| 永平县| 安乡县| 周宁县| 舒城县| 赫章县| 紫云| 琼中| 万山特区| 新乡市| 清徐县| 吴堡县| 丰都县| 井冈山市| 宝应县| 兴化市| 大姚县| 娄底市| 肇州县| 会同县| 始兴县| 新密市| 天祝| 上高县| 涞水县| 丰顺县| 呼图壁县| 新闻| 迁安市| 岱山县| 余庆县| 长阳| 城固县| 阿勒泰市| 鄂托克旗| 霍州市| 榕江县| 嘉祥县| 阳东县| 岳池县|