天天看點

java 程式性能優化《第二章》設計優化 2.1善用設計模式 2 代理模式

代理模式也是一種很常見的設計模式。它使用代理對象完成使用者請求,屏蔽使用者對真實對象的通路。就如同現實中的代理一樣,代理人被授權執行當事人的一些适宜,而無需當事人出面,從第三方的角度看,似乎當事人并不存在,因為他隻和代理人通信。而事實上,代理人是要有當事人的授權,并且在核心問題上還需要請示當事人。

在現實中,使用代理的情況很普遍,而且原因也很多。比如,當事人因為某些隐私不友善出面,或者當事人不具備某些相關的專業技能,而需要一個職業人員來完成一些專業的操作,也可能由于當事人沒有時間處理事務,而聘用代理人出面。

在軟體設計中,使用代理模式的意圖也很多,比如因為安全問題,需要屏蔽用戶端直接通路真實對象;或者在遠端調用中,需要使用代理類處理遠端方法調用的技術細節(如 rmi );也可能是為了提升系統性能,對真實對象進行封裝,進而達到延遲加載的目的。在本節中,主要讨論使用代理模式實作延遲加載,進而提升系統的性能和反應速度。

代理模式的主要參與者有4個,如表2.1所示。

表2.1 代理模式角色

角色

作用

主題接口

定義代理類和真實主題的公共對外方法,也是代理類代理真實主題的方法

真實主題

真正實作業務邏輯的類

代理類

用來代理和封裝真實主題

main

用戶端,使用代理類和主題接口完成一些工作

以一個簡單的例子來闡述使用代理模式實作延遲加載的方法及其意義。假設用戶端軟體,有根據使用者請求,去資料庫查詢資料的功能。在查詢資料前,當系統有大量的類似操作存在時(比如xml解析等) ,所有這些初始化操作的疊加,會使得系統的啟動速度變得非常緩慢。為此,使用代理模式,使用代理類,封裝對資料庫查詢中的初始化操作,當系統啟動時,初始化這個代理類,而非真實地資料庫查詢類,而代理類什麼都沒有做,是以,它的構造是相當迅速的。

在系統啟動時,将消耗資源最多的方法都使用代理模式分離,就可以加快系統的啟動速度,減少使用者的等待時間。而在使用者真正做查詢操作時,再有代理類,單獨去加載真實的資料庫查詢類,完成使用者的請求。這個過程就是使用代理模式實作了延遲加載。

ps:代理模式可以用于多種場合,如果用于遠端調用的網絡代理、考慮安全因素的安全代理等,延遲加載隻是代理模式的一種應用場景。

延遲加載的核心思想是:如果目前并沒有使用這個元件,則不需要真正地初始化它,使用一個代理對象替代它原有的位置,隻要在真正需要使用的時候,才對它進行加載。使用代理模式的延遲加載時非常有意義的,首先,它可以在時間軸上分散系統壓力,尤其在系統啟動時,不必完成所有的初始化工作,進而加速啟動時間;其次,對很多真實主題而言,在軟體啟動直到被關閉的整個過程中,可能根本不會被調用,初始化這些資料無疑是一種資源浪費。圖2.2顯示了使用代理類封裝資料庫查詢類後,系統的啟動過程。

未完。待續!