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

Java基礎(chǔ)之讓你徹底搞懂代理模式

 更新時(shí)間:2021年04月26日 15:38:00   作者:猿華  
這篇文章主要介紹了Java基礎(chǔ)之讓你徹底搞懂代理模式,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下

一、代理模式

什么是代理模式?

先來生活常用例子:你想買票,你沒必要去車站買;而是可以去一個(gè)代售點(diǎn),代售點(diǎn)代理車站賣票,這就是一個(gè)簡(jiǎn)單的代理模式!

  • 主要解決:在直接訪問對(duì)象時(shí)帶來的問題,比如說:要訪問的對(duì)象在遠(yuǎn)程的機(jī)器上。在面向?qū)ο笙到y(tǒng)中,有些對(duì)象由于某些原因(比如對(duì)象創(chuàng)建開銷很大,或者某些操作需要安全控制,或者需要進(jìn)程外的訪問),直接訪問會(huì)給使用者或者系統(tǒng)結(jié)構(gòu)帶來很多麻煩,我們可以在訪問此對(duì)象時(shí)加上一個(gè)對(duì)此對(duì)象的訪問層。
  • 總結(jié):我們?cè)L問實(shí)例對(duì)象時(shí)是通過代理對(duì)象訪問的,這樣比較靈活也可以添加一些附加操作

二、靜態(tài)代理

顧名思義,靜態(tài)的,由程序員構(gòu)寫,在編譯是就已經(jīng)將程序接口,代理類和被代理類寫定了!在程序運(yùn)行前就已經(jīng)生成!
來個(gè)簡(jiǎn)單實(shí)例:

在這里插入圖片描述

設(shè)計(jì)公共接口Person:

public interface Person {
    public void handinWork();
}

Student:

public class Student implements Person {
    private String name;

    public Student(String name) {
        this.name=name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void handinWork() {
        System.out.println(name+"提交作業(yè)");
    }
}

代理類StudentProxy:

public class StudentProxy implements Person {
    //代理誰
    Student student;
    //防止重名,確保只是代理Student這個(gè)對(duì)象
    public StudentProxy(Student student) {
        if(student.getClass()==Student.class){
            this.student = (Student) student;
        }
    }

    public void handinWork() {
        //交作業(yè)時(shí)代理(班長(zhǎng))想代替學(xué)生搞點(diǎn)事···
        System.out.println("老師這個(gè)比的作業(yè)是抄的呢");
        student.handinWork();
    }
}

測(cè)試:

public class StaticProxy {
    public static void main(String[] args) {
        //創(chuàng)建出兩個(gè)對(duì)象,代理和被代理
        Student student = new Student("張三");
        StudentProxy monitor = new StudentProxy(student);
        //代理類去交作業(yè)?。。。?!
        monitor.handinWork();
    }
}

可以發(fā)現(xiàn),程序本質(zhì)還是學(xué)生交作業(yè),不過是通過一個(gè)中間層monitor(班長(zhǎng))去實(shí)現(xiàn)的,然后這個(gè)代理層還可以添加些其他的操作功能,在提交作業(yè)之前或者之后!

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

靜態(tài)代理是在程序運(yùn)行前就生成了,很明顯動(dòng)態(tài)代理就是在程序運(yùn)行期間添加代理層以達(dá)到效果。代理類動(dòng)態(tài)生成!

  • 需要了解兩個(gè)類:Proxy 代理, InvocationHandler
  • Proxy:代理類,使用的時(shí)候動(dòng)態(tài)生成
  • InvocationHandler:主要執(zhí)行需要代理的方法,使用invoke執(zhí)行

舉個(gè)例子:方便理解,就上面那個(gè)實(shí)例我們將它改造成一個(gè)動(dòng)態(tài)的!

第一步,創(chuàng)建一個(gè)類實(shí)現(xiàn)InvocationHandler接口,用它構(gòu)建出代理類和代理方法:

public class ProxyInvocation implements InvocationHandler {
    //被代理的接口,真實(shí)的對(duì)象
    private Person person;
    //生成得到的代理類

    public void setPerson(Person person) {
        this.person = person;
    }
    //通過Proxy類的newProxyInstance方法創(chuàng)建代理對(duì)象,我們來看下方法中的參數(shù)
    //         * 第一個(gè)參數(shù):people.getClass().getClassLoader(),使用handler對(duì)象的classloader對(duì)象來加載我們的代理對(duì)象
    //         * 第二個(gè)參數(shù):people.getClass().getInterfaces(),這里為代理類提供的接口是真實(shí)對(duì)象實(shí)現(xiàn)的接口,這樣代理對(duì)象就能像真實(shí)對(duì)象一樣調(diào)用接口中的所有方法
    //         * 第三個(gè)參數(shù):handler,我們將代理對(duì)象關(guān)聯(lián)到上面的InvocationHandler對(duì)象上
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),person.getClass().getInterfaces(),this);
    }
    //處理代理實(shí)例,返回結(jié)果
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(person, args);
        return result;
    }
}

參照靜態(tài)代理,需要一個(gè)代理對(duì)象,只不過靜態(tài)代理中代理對(duì)象是我們手動(dòng)創(chuàng)建的,所以動(dòng)態(tài)代理中我們利用jdk自帶代理類Proxy的newProxyInstance方法動(dòng)態(tài)的生成了一個(gè)代理類而已,這個(gè)代理類可以根據(jù)我們傳的參數(shù)動(dòng)態(tài)改變,

測(cè)試:

 //真實(shí)角色student
        Student student = new Student("張三");
        //拿到InvocationHandler的繼承類
        ProxyInvocation pih = new ProxyInvocation();
        //拿到代理的接口
        pih.setPerson(student);
        //動(dòng)態(tài)生成了proxy代理類
        Person proxy = (Person) pih.getProxy();
        //代理類執(zhí)行方法
        proxy.handinWork();

改進(jìn)成工具類:將獲得接口部分全部采用參數(shù)代替;

private Object target;
    //生成得到的代理類

    public void setPerson(Object target) {
        this.target= target;
    }
    //通過Proxy類的newProxyInstance方法創(chuàng)建代理對(duì)象,我們來看下方法中的參數(shù)
    //         * 第一個(gè)參數(shù):people.getClass().getClassLoader(),使用handler對(duì)象的classloader對(duì)象來加載我們的代理對(duì)象
    //         * 第二個(gè)參數(shù):people.getClass().getInterfaces(),這里為代理類提供的接口是真實(shí)對(duì)象實(shí)現(xiàn)的接口,這樣代理對(duì)象就能像真實(shí)對(duì)象一樣調(diào)用接口中的所有方法
    //         * 第三個(gè)參數(shù):handler,我們將代理對(duì)象關(guān)聯(lián)到上面的InvocationHandler對(duì)象上
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }
    //處理代理實(shí)例,返回結(jié)果
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(person, args);
        return result;
    }

就是把接口類型和參數(shù)改一下就可以!后續(xù)會(huì)添加代理模式在Spring上的使用,

四、總結(jié)

你不敲一遍代碼你永遠(yuǎn)都不會(huì)理解,你抱著學(xué)一遍而不是徹底弄明白你也不可能學(xué)會(huì)!多查資料多理解代碼,多花點(diǎn)時(shí)間一定會(huì)懂得!加油老鐵。以解決問題的心態(tài)學(xué)編程而不是為了高薪工作。

到此這篇關(guān)于Java基礎(chǔ)之讓你徹底搞懂代理模式的文章就介紹到這了,更多相關(guān)java代理模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot實(shí)現(xiàn)rabbitmq消息確認(rèn)的示例代碼

    springboot實(shí)現(xiàn)rabbitmq消息確認(rèn)的示例代碼

    RabbitMQ的消息確認(rèn)有兩種, 一種是消息發(fā)送確認(rèn),第二種是消費(fèi)接收確認(rèn),本文主要介紹了springboot實(shí)現(xiàn)rabbitmq消息確認(rèn)的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • spring boot下 500 404 錯(cuò)誤頁面處理的方法

    spring boot下 500 404 錯(cuò)誤頁面處理的方法

    本篇文章主要介紹了spring boot下 500 404 錯(cuò)誤頁面處理的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Java 操作Properties配置文件詳解

    Java 操作Properties配置文件詳解

    本篇文章主要介紹了Java 操作Properties配置文件詳解,詳細(xì)的介紹了Properties和主要方法,有興趣的可以了解下
    2017-05-05
  • 深入淺析jni中的java接口使用

    深入淺析jni中的java接口使用

    這篇文章主要介紹了jni中的java接口使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java 進(jìn)程執(zhí)行外部程序造成阻塞的一種原因

    Java 進(jìn)程執(zhí)行外部程序造成阻塞的一種原因

    前一陣子在研究文檔展示時(shí)使用了java進(jìn)程直接調(diào)用外部程序,其中遇到一個(gè)問題花了好長(zhǎng)時(shí)間才解決,這個(gè)問題就是外部程序直接執(zhí)行沒什么問題,但是當(dāng)使用Java進(jìn)程執(zhí)行時(shí)外部程序就阻塞在那兒不動(dòng)了。而且這個(gè)外部程序在處理某些文件時(shí)使用Java進(jìn)程執(zhí)行是沒問題的
    2014-03-03
  • 解決nacos啟動(dòng)報(bào)錯(cuò)Server check fail, please check server localhost ,port 9848 is available的問題

    解決nacos啟動(dòng)報(bào)錯(cuò)Server check fail, please che

    這篇文章主要介紹了nacos啟動(dòng) Server check fail, please check server localhost ,port 9848 is available的錯(cuò)誤原因以及解決方法,需要的朋友可以參考下
    2023-09-09
  • Java Spring事務(wù)使用及驗(yàn)證過程詳解

    Java Spring事務(wù)使用及驗(yàn)證過程詳解

    這篇文章主要介紹了Java Spring事務(wù)使用及驗(yàn)證過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之隊(duì)列

    Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之隊(duì)列

    這篇文章主要介紹了Java隊(duì)列數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn),隊(duì)列是一種特殊的線性表,只允許在表的隊(duì)頭進(jìn)行刪除操作,在表的后端進(jìn)行插入操作,隊(duì)列是一個(gè)有序表先進(jìn)先出,想了解更多相關(guān)資料的小伙伴可以參考下面文章的詳細(xì)內(nèi)容
    2022-02-02
  • Jmeter多臺(tái)機(jī)器并發(fā)請(qǐng)求實(shí)現(xiàn)壓力性能測(cè)試

    Jmeter多臺(tái)機(jī)器并發(fā)請(qǐng)求實(shí)現(xiàn)壓力性能測(cè)試

    這篇文章主要介紹了Jmeter多臺(tái)機(jī)器并發(fā)請(qǐng)求實(shí)現(xiàn)壓力性能測(cè)試,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Spring中的父子容器原理解析

    Spring中的父子容器原理解析

    這篇文章主要為大家介紹了Spring中的父子容器原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評(píng)論