欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

代理模式(Proxy)

代理模式的基本介紹

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

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

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

靜態(tài)代理

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

應(yīng)用實(shí)例

1、定義一個(gè)接口ITeacherDao

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

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

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

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

接口

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

接口實(shí)現(xiàn)

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

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

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

調(diào)用

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

輸出

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

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

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

2.缺點(diǎn):因?yàn)榇韺?duì)象需要與目標(biāo)對(duì)象實(shí)現(xiàn)一樣的接口,所以會(huì)有很多代理類

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

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

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

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

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

JDK中生成代理對(duì)象API

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

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

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

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

在這里插入圖片描述

接口

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

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

調(diào)用測(cè)試

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

輸出

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

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

相關(guān)文章

  • 舉例說明JAVA調(diào)用第三方接口的GET/POST/PUT請(qǐng)求方式

    舉例說明JAVA調(diào)用第三方接口的GET/POST/PUT請(qǐng)求方式

    在日常工作和學(xué)習(xí)中,有很多地方都需要發(fā)送請(qǐng)求,這篇文章主要給大家介紹了關(guān)于JAVA調(diào)用第三方接口的GET/POST/PUT請(qǐng)求方式的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • Java重寫與重載之間的區(qū)別

    Java重寫與重載之間的區(qū)別

    本文主要介紹了Java重寫與重載之間的區(qū)別。具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • 使用curator實(shí)現(xiàn)zookeeper鎖服務(wù)的示例分享

    使用curator實(shí)現(xiàn)zookeeper鎖服務(wù)的示例分享

    這篇文章主要介紹了使用curator實(shí)現(xiàn)zookeeper鎖服務(wù)的示例,需要的朋友可以參考下
    2014-02-02
  • JDBC連接mysql亂碼異常問題處理總結(jié)

    JDBC連接mysql亂碼異常問題處理總結(jié)

    這篇文章主要介紹了JDBC連接mysql亂碼異常問題處理的辦法和思路,有需要的朋友參考學(xué)習(xí)下。
    2017-12-12
  • Servlet中配置和使用過濾器的步驟記錄

    Servlet中配置和使用過濾器的步驟記錄

    這篇文章主要介紹了在Servlet中配置和使用過濾器的方法,包括創(chuàng)建過濾器類、配置過濾器以及在Web應(yīng)用中使用過濾器等步驟,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-01-01
  • Spring解決循環(huán)依賴問題及三級(jí)緩存的作用

    Spring解決循環(huán)依賴問題及三級(jí)緩存的作用

    這篇文章主要介紹了Spring解決循環(huán)依賴問題及三級(jí)緩存的作用,所謂的三級(jí)緩存只是三個(gè)可以當(dāng)作是全局變量的Map,Spring的源碼中大量使用了這種先將數(shù)據(jù)放入容器中等使用結(jié)束再銷毀的代碼風(fēng)格
    2022-07-07
  • Java由淺入深講解繼承下

    Java由淺入深講解繼承下

    繼承就是可以直接使用前輩的屬性和方法。自然界如果沒有繼承,那一切都是處于混沌狀態(tài)。多態(tài)是同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力。多態(tài)就是同一個(gè)接口,使用不同的實(shí)例而執(zhí)行不同操作
    2022-04-04
  • Java編程中的一些常見問題匯總

    Java編程中的一些常見問題匯總

    這篇文章主要介紹了Java編程中的一些常見問題匯總,本文總結(jié)的都是一些Java代碼中比較典型的錯(cuò)誤,需要的朋友可以參考下
    2014-09-09
  • Java多態(tài)中動(dòng)態(tài)綁定原理解析

    Java多態(tài)中動(dòng)態(tài)綁定原理解析

    這篇文章主要介紹了Java多態(tài)中動(dòng)態(tài)綁定原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • mybatis-plus報(bào)錯(cuò)net.sf.jsqlparser.statement.select.SelectBody的問題解決

    mybatis-plus報(bào)錯(cuò)net.sf.jsqlparser.statement.select.SelectBody的

    本文主要介紹了mybatis-plus報(bào)錯(cuò)net.sf.jsqlparser.statement.select.SelectBody的問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08

最新評(píng)論