中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中的代理模式是什么意思

發布時間:2022-02-28 11:02:00 來源:億速云 閱讀:235 作者:小新 欄目:開發技術

這篇文章主要介紹了Java中的代理模式是什么意思,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

一、代理模式

什么是代理模式?

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

  • 主要解決:在直接訪問對象時帶來的問題,比如說:要訪問的對象在遠程的機器上。在面向對象系統中,有些對象由于某些原因(比如對象創建開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問),直接訪問會給使用者或者系統結構帶來很多麻煩,我們可以在訪問此對象時加上一個對此對象的訪問層。

  • 總結:我們訪問實例對象時是通過代理對象訪問的,這樣比較靈活也可以添加一些附加操作

二、靜態代理

顧名思義,靜態的,由程序員構寫,在編譯是就已經將程序接口,代理類和被代理類寫定了!在程序運行前就已經生成!
來個簡單實例:

Java中的代理模式是什么意思

設計公共接口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+"提交作業");
    }
}

代理類StudentProxy:

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

    public void handinWork() {
        //交作業時代理(班長)想代替學生搞點事···
        System.out.println("老師這個比的作業是抄的呢");
        student.handinWork();
    }
}

測試:

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

可以發現,程序本質還是學生交作業,不過是通過一個中間層monitor(班長)去實現的,然后這個代理層還可以添加些其他的操作功能,在提交作業之前或者之后!

三、動態代理

靜態代理是在程序運行前就生成了,很明顯動態代理就是在程序運行期間添加代理層以達到效果。代理類動態生成!

  • 需要了解兩個類:Proxy 代理, InvocationHandler

  • Proxy:代理類,使用的時候動態生成

  • InvocationHandler:主要執行需要代理的方法,使用invoke執行

舉個例子:方便理解,就上面那個實例我們將它改造成一個動態的!

第一步,創建一個類實現InvocationHandler接口,用它構建出代理類和代理方法:

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

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

參照靜態代理,需要一個代理對象,只不過靜態代理中代理對象是我們手動創建的,所以動態代理中我們利用jdk自帶代理類Proxy的newProxyInstance方法動態的生成了一個代理類而已,這個代理類可以根據我們傳的參數動態改變,

測試:

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

改進成工具類:將獲得接口部分全部采用參數代替;

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

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

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

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Java中的代理模式是什么意思”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

桐庐县| 布尔津县| 乐都县| 无为县| 磴口县| 克拉玛依市| 唐山市| 个旧市| 荆州市| 景东| 长葛市| 陇西县| 宝丰县| 开远市| 庄河市| 团风县| 嵩明县| 镇康县| 定西市| 贵德县| 金塔县| 吉隆县| 宕昌县| 华阴市| 江川县| 民乐县| 宝坻区| 游戏| 沙田区| 嘉禾县| 桦南县| 沾化县| 峡江县| 安图县| 景宁| 香格里拉县| 西宁市| 武汉市| 唐海县| 新郑市| 清涧县|