程序設計優化——(2)代理模式(基本原理實現)

  簡介:代理模式使用代理對象完成用戶請求,屏蔽用戶對真實對象的訪問。就如同現實中的代理同樣,代理人被受權執行當事人的一些事,而無需當事人出面。java

  代理的做用:①基於安全考慮,須要屏蔽客戶端直接訪問真實對象;②提高系統性能和反應速度,對真實對象進行封裝,冬兒達到延遲加載的目的。數據庫

   好比在系統在啓動時,初始化系統全部的類,若全部的類都是去得到真實鏈接,速度緩慢且耗損內存,而且可能有些初始化後根本不會被調用,而使用代理模式是初始化這個代理類,而非真實的主題。當系統真正啓動功後,再使用這個功能時,再去經過代理類去構造真實主題實現真實邏輯。好比數據庫鏈接;網絡鏈接等。安全

  延遲加載的核心思想:若是沒有真實使用某個組件時,不須要真正地初始化它,只有在真正使用的時候,纔對它進行加載。(在時間軸上可以分散系統壓力)網絡

1.代理模式的結構性能

  1)主題接口:定義代理類和真實主題的公共對外接口,即代理類代理真實主題的方法。測試

  2)真實主題:真正實現業務邏輯的類spa

  3)代理類:用來代理和封裝真實主題代理

  4)Main:客戶端code

2.代理模式的實現和使用對象

  1)主題接口 

  IDBQuery.java

    package com.hxc.proxy.proxyMode;
    
    /**
     * <p>Description: 主題接口</p>
     * @author Huang Xiaocong
     * @data 2019年10月27日
     */
    public interface IDBQuery {
        String request();
    }

 

  2)真實主題  

  DBQuery.java

    package com.hxc.proxy.proxyMode;
    /**
     * <p>Description: 真實主題</p>
     * @author Huang Xiaocong
     * @data 2019年10月27日
     */
    public class DBQuery implements IDBQuery {
    
        public DBQuery() {
            try {
                Thread.sleep(1000);    //模擬執行過程
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        public String request() {
            return "request String";
        }
    
    }

 

  3)代理類 建立過程很快,用於替代DBQuery.java(真實主題)

  DBQueryProxy.java
    package com.hxc.proxy.proxyMode;
    /**
     * <p>Description: 代理類</p>
     * @author Huang Xiaocong
     * @data 2019年10月27日
     */
    public class DBQueryProxy implements IDBQuery {
    
        private DBQuery real = null;
        public String request() {
            if(real == null) {
                real = new DBQuery();
            }
            return real.request();
        }
        
    }

 

  4)客戶端(測試類)

  Main.java

    package com.hxc.proxy.proxyMode;
    /**
     * <p>Description: 客戶端</p>
     * @author Huang Xiaocong
     * @data 2019年10月27日
     */
    public class Main {
        
        public static void main(String[] args) {
            long begin = System.currentTimeMillis(); 
            IDBQuery dbQuery = new DBQueryProxy();
            System.out.println("DBQueryProxy time is : " + (System.currentTimeMillis() - begin));
            begin = System.currentTimeMillis();
            String request = dbQuery.request();
            System.out.println(request);
            System.out.println("DBQuery time is : " + (System.currentTimeMillis() - begin));
        }
    }

 在筆者的控制檯輸出結果以下:

DBQueryProxy time is : 0
request String
DBQuery time is : 1002

 

從上面結果能夠看到,加載代理模式的時間爲0,徹底不須要啥時間,而加載真實主題須要的時間徹底就是真實業務邏輯的執行時間。將代理模式用因而實現延遲加載,能夠有效地替身系統的啓動速度,對改善用戶體驗有很大的幫助。

相關文章
相關標籤/搜索