目錄
代理模式:靜態代理人
1、代理模式的定義
2、代理模式的優缺點
3、代理模式的分類
#4、靜態代理模式的結構 
5、代理模式的應用場景
首頁 Java java教程 Java的代理模式怎麼理解

Java的代理模式怎麼理解

Apr 19, 2023 am 11:34 AM
java

    代理模式:靜態代理人

    有時候,我們可能不想直接面對某事或某人,這樣我們就可以找一個中介的人去替我們做,例如送禮物叫跑腿、找清潔上某某同城等等。這樣對方也不知道中介的背後是誰參與,起到一個中介作用和保護目標物的作用,這就是代理模式。也就是有一個中介代替你去做。

    Java的代理模式怎麼理解

    1、代理模式的定義

    由於某些原因需要提供一個代理程式給某個物件以控制對該物件的存取。這時,存取對像不適合或不能直接引用目標對象,代理對像作為訪問對象和目標對象之間的中介

    #簡單結構圖:

    Java的代理模式怎麼理解

    2、代理模式的優缺點

    #優點:

    1.在客戶端與目標物件之間起到一個中介作用和保護目標物件的作用

    2.可以擴展目標物件的功能

    3.能將客戶端與目標物件分離,在一定程度上降低了系統的耦合度,增加了程式的可擴展性

    缺點:

    1.會造成系統設計中類別的數量增加(因為多了一個或多個中介類別(代理))

    2.在客戶端與目標對象之間增加一個代理對象,會造成請求處理速度變慢

    #3.增加了系統的複雜度

    3、代理模式的分類

    代理模式分為靜態代理程式(本文)動態代理程式(下一篇文章)

    • 靜態: 由程式設計師建立代理類別或特定工具自動產生原始程式碼再對其編譯,在程式執行前代理類別的.class 檔案就已經存在了

    • 動態: 在程式運作時,運用反射機制動態創建而成

    #4、靜態代理模式的結構 

    1.抽象主題類別: 透過介面或抽象類別宣告真實主題和代理物件實現的業務方法

    2.真實主題類別: 實作了抽象主題中的具體業務,是代理對象所代表的真實對象,是最終要引用的對象

    3.代理類: 提供了與真實主題相同的接口,其內部含有對真實主題的引用,它可以存取、控製或擴展真實主題的功能

    #程式碼演示:

    定義一個抽象主題:

    #靜​​態代理程式在使用時,需要定義介面或父類,而被代理物件與代理物件一起實作相同的介面或是繼承相同父類別

    /**
     *抽象主题
     */
    
    public interface Subject {
        void Request();
    }
    登入後複製

    真實主題:

    /**
     *真实主题类:实现抽象主题
     */
    public class RealSubject implements Subject{
        @Override
        public void Request() {
            System.out.println("您的航班正在飞行");
        }
    }
    登入後複製

    代理程式類別:

    //代理类,实现抽象类的接口
    public class Proxy implements Subject{
    
        private RealSubject realSubject;
    
        @Override
        public void Request() {
            //先判断是否存在真实主题RealSubject
            //如果没有,就新建一个
            if(realSubject == null){
                realSubject = new RealSubject();
            }
    
            //预处理,使用这个方法
            preRequest();
    
            //去访问真实主题类的方法
            realSubject.Request();
    
            //代理类的后续方法
            postRequest();
        }
    
        private void preRequest() {
            System.out.println("航班马上起飞啦");
        }
    
        private void postRequest() {
            System.out.println("航班到达目的地,感谢乘坐");
        }
    
    
    }
    登入後複製

    測試類別:

    public class Test {
        public static void main(String[] args) {
    
            //使用代理去访问RealSubject里面的Request
            Proxy proxy = new Proxy();
            proxy.Request();
        }
    }
    登入後複製

    輸出結果:

    航班馬上起飛啦
    您的航班正在飛行
    航班到達目的地,感謝乘坐

    通過上面的演示,用來一個代理類去訪問了真實主題類別的方法,這樣測試類別就不知道到底是誰來訪問的,是代理類別呢還是代理類別後面還有其他人,這樣就可以很好的保護對象。這也是代理模式的優點。

    靜態代理程式的總結:

    可以在不修改目標物件的功能前提下,對目標實作功能擴展,但是代理物件需要與目標物件實作一樣的接口,所以會有很多代理類,當代理類很多的時候,維護的複雜度就會變大,那該怎麼解決這個問題呢?那就需要使用動態代理。

    5、代理模式的應用場景

    當無法或不想直接引用某個物件或存取某個物件有困難時,可以透過代理物件間接存取。使用代理模式主要有兩個目的:一是保護目標對象,二是增強目標對象

    #此應用程式場景總結參考自互聯網:

    • #遠端代理,這種方式通常是為了隱藏目標物件存在於不同位址空間的事實,方便客戶端存取。例如,當使用者申請某些網盤空間時,會在使用者的檔案系統中建立一個虛擬的硬碟,使用者造訪虛擬硬碟時實際存取的是網盤空間

    • 虛擬代理,這種方式通常用於要建立的目標物件開銷很大時。例如,下載一幅很大的圖像需要很長時間,因某種計算比較複雜而短時間無法完成,這時可以先用小比例的虛擬代理替換真實的對象,消除用戶對伺服器慢的感覺

    • 安全代理,這種方式通常用來控制不同種類客戶對真實物件的存取權

    • 智慧指引,主要用於呼叫目標物件時,代理附加一些額外的處理功能。例如,增加計算真實物件的引用次數的功能,這樣當該物件沒有被引用時,就可以自動釋放它

    • 延遲加載,指為了提高系統的效能,延遲對目標的載入。例如,Hibernate 中就存在屬性的延遲載入和關聯表的延時載入

    #

    以上是Java的代理模式怎麼理解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    AI Hentai Generator

    AI Hentai Generator

    免費產生 AI 無盡。

    熱門文章

    R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
    1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.最佳圖形設置
    1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
    威爾R.E.P.O.有交叉遊戲嗎?
    1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    Java 中的完美數 Java 中的完美數 Aug 30, 2024 pm 04:28 PM

    Java 完美數指南。這裡我們討論定義,如何在 Java 中檢查完美數?

    Java中的Weka Java中的Weka Aug 30, 2024 pm 04:28 PM

    Java 版 Weka 指南。這裡我們透過範例討論簡介、如何使用 weka java、平台類型和優點。

    Java 中的史密斯數 Java 中的史密斯數 Aug 30, 2024 pm 04:28 PM

    Java 史密斯數指南。這裡我們討論定義,如何在Java中檢查史密斯號?帶有程式碼實現的範例。

    Java Spring 面試題 Java Spring 面試題 Aug 30, 2024 pm 04:29 PM

    在本文中,我們保留了最常被問到的 Java Spring 面試問題及其詳細答案。這樣你就可以順利通過面試。

    突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

    Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

    Java 中的時間戳至今 Java 中的時間戳至今 Aug 30, 2024 pm 04:28 PM

    Java 中的時間戳記到日期指南。這裡我們也結合範例討論了介紹以及如何在java中將時間戳記轉換為日期。

    Java程序查找膠囊的體積 Java程序查找膠囊的體積 Feb 07, 2025 am 11:37 AM

    膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

    如何在Spring Tool Suite中運行第一個春季啟動應用程序? 如何在Spring Tool Suite中運行第一個春季啟動應用程序? Feb 07, 2025 pm 12:11 PM

    Spring Boot簡化了可靠,可擴展和生產就緒的Java應用的創建,從而徹底改變了Java開發。 它的“慣例慣例”方法(春季生態系統固有的慣例),最小化手動設置

    See all articles