<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 代理設計模式 > 原文: [https://howtodoinjava.com/design-patterns/structural/proxy-design-pattern/](https://howtodoinjava.com/design-patterns/structural/proxy-design-pattern/) 根據**代理設計模式**的 GoF 定義,代理對象為另一對象提供**代理或占位符**來控制對其的訪問。 代理基本上可以替代我們由于許多原因而創建的預期對象,例如,與創建完全初始化的原始對象相關的安全性原因或成本。 ## 1.何時使用代理設計模式 代理對象隱藏原始對象并控制對其的訪問。 當我們可能想要使用可以充當其他接口的類時,可以使用代理。 代理大量用于實現與延遲加載相關的用例,在這種情況下,我們直到真正需要時才創建完整的對象。 代理也可以用于在原始對象周圍添加額外的安全層。 ## 2.代理模式的真實示例 * 在 [hibernate](https://howtodoinjava.com/hibernate-tutorials/) 中,我們編寫了從數據庫中獲取實體的代碼。 Hibernate 返回一個對象,該對象由代理(通過擴展域類由 Hibernate 動態構造)到基礎實體類。 客戶端代碼能夠讀取數據,而無論需要使用代理讀取什么內容。 這些代理實體類有助于實現延遲加載方案,在這種方案中,只有在明確請求關聯實體時,才提取它們。 它有助于提高 DAO 操作的性能。 * 在公司網絡中,互聯網訪問位于網絡代理后面。 所有網絡請求都通過代理,該代理首先檢查對允許的網站和發布到網絡的數據的請求。 如果請求看起來可疑,則代理將阻止該請求,否則請求將通過。 * 在面向切面的編程(AOP)中,由 AOP 框架創建的一個對象,用于實現切面協定(建議方法執行等)。 例如,在 [Spring AOP](https://howtodoinjava.com/spring-aop/spring-aop-aspectj-example-tutorial-using-annotation-config/) 中,AOP 代理將是 JDK 動態代理或 CGLIB 代理。 ## 3.代理設計模式 #### 3.1 架構 ![Proxy design pattern](https://img.kancloud.cn/b4/c5/b4c57919c490040db2079f702476f85d_620x240.png) 代理設計模式 #### 3.2 設計參與者 * **`Subject`** – 是一個接口,它公開了可供客戶端使用的功能。 * **`RealSubject`** – 是實現`Subject`的類,并且是具體的實現,需要隱藏在代理后面。 * **`Proxy`** – 通過擴展它來隱藏真實對象,并且客戶端通過此代理對象與真實對象進行通信。 通常,當客戶端請求真實對象時,框架會創建此代理對象。 ## 4.代理設計模式示例 在給定的示例中,我們有一個`RealObject`,客戶端需要訪問它才能執行某項操作。 它將要求框架提供`RealObject`的實例。 但是由于需要保護對該對象的訪問,因此框架將對`RealObjectProxy`的引用返回。 對代理對象的任何調用都用于其他要求,并且該調用將傳遞給實際對象。 ```java public interface RealObject { public void doSomething(); } ``` ```java public class RealObjectImpl implements RealObject { @Override public void doSomething() { System.out.println("Performing work in real object"); } } ``` ```java public class RealObjectProxy extends RealObjectImpl { @Override public void doSomething() { //Perform additional logic and security //Even we can block the operation execution System.out.println("Delegating work on real object"); super.doSomething(); } } ``` ```java public class Client { public static void main(String[] args) { RealObject proxy = new RealObjectProxy(); proxy.doSomething(); } } ``` 程序輸出。 ```java Delegating work on real object Performing work in real object ``` ## 5.常見問題 #### 5.1 有哪些不同類型的代理 代理通常分為四種類型: 1. **遠程代理** – 表示遠程授乳的對象。 要與遠程對象對話,客戶端需要在網絡通信方面做其他工作。 代理對象代表原始對象進行此通信,而客戶端則專注于實際交談。 2. **虛擬代理** – 延遲昂貴對象的創建和初始化,直到需要時才按需創建對象。 Hibernate 創建的代理實體是虛擬代理的示例。 3. **保護代理** – 幫助實現對原始對象的安全性。 他們可以在方法調用之前檢查訪問權限,然后根據結論允許或拒絕訪問。 4. **智能代理** – 當客戶端訪問對象時,執行其他內部管理工作。 一個示例可以是在訪問真實對象之前檢查它是否已鎖定,以確保沒有其他對象可以更改它。 #### 5.2 代理模式與裝飾器模式 兩種模式之間的主要區別是它們承擔的責任。 [裝飾器](https://howtodoinjava.com/design-patterns/structural/decorator-design-pattern/)專注于添加職責,但是代理專注于控制對對象的訪問。 在評論中向我發送有關**代理模式**的問題。 學習愉快! 參考文獻: 圖片來源 – [維基百科](https://en.wikipedia.org/wiki/Proxy_pattern)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看