15.7 代理模式效果與適用情境
代理模式是常用的結構型設計模式之一,它為對象的間接訪問提供了一個解決方案,可以對對象的訪問進行控制。代理模式類型較多,其中遠程代理、虛擬代理、保護代理等在軟體開發中應用非常廣泛。
15.7.1 模式優點
代理模式的共同優點如下:
(1) 能夠協調調用者和被調用者,在一定程度上降低了系統的耦合度。
(2) 用戶端可以針對抽象主題角色進行編程,增加和更換代理類無須修改原始碼,符合開閉原則,系統具有較好的靈活性和可擴充性。
此外,不同類型的代理模式也具有獨特的優點,例如:
(1) 遠程代理為位於兩個不同地址空間對象的訪問提供了一種實現機制,可以將一些消耗資源較多的對象和操作移至效能更好的電腦上,提高系統的整體運行效率。
(2) 虛擬代理通過一個消耗資源較少的對象來代表一個消耗資源較多的對象,可以在一定程度上節省系統的運行開銷。
(3) 緩衝代理為某一個操作的結果提供臨時的緩衝儲存空間,以便在後續使用中能夠共用這些結果,最佳化系統效能,縮短執行時間。
(4) 保護代理可以控制對一個對象的存取權限,為不同使用者提供不同層級的使用許可權。
15.7.2 模式缺點
代理模式的主要缺點如下:
(1) 由於在用戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢,例如保護代理。
(2) 實現代理模式需要額外的工作,而且有些代理模式的實現過程較為複雜,例如遠程代理。
15.7.3 模式適用情境
代理模式的類型較多,不同類型的代理模式有不同的優缺點,它們應用於不同的場合:
(1) 當用戶端對象需要訪問遠程主機中的對象時可以使用遠程代理。
(2) 當需要用一個消耗資源較少的對象來代表一個消耗資源較多的對象,從而降低系統開銷、縮短已耗用時間時可以使用虛擬代理,例如一個對象需要很長時間才能完成載入時。
(3) 當需要為某一個被頻繁訪問的操作結果提供一個臨時儲存空間,以供多個用戶端共用訪問這些結果時可以使用緩衝代理。通過使用緩衝代理,系統無須在用戶端每一次訪問時都重新執行操作,只需直接從臨時緩衝區擷取操作結果即可。
(4) 當需要控制對一個對象的訪問,為不同使用者提供不同層級的存取權限時可以使用保護代理。
(5) 當需要為一個對象的訪問(引用)提供一些額外的操作時可以使用智能引用代理。
習題
1. Windows作業系統中的應用程式捷徑是( )模式的應用執行個體。
A. 代理 (Proxy) B. 組合 (Composite)
C. 裝飾 (Decorator) D. 外觀 (Facade)
2. 畢業生通過職業介紹所找工作,請問該過程蘊含了哪種設計模式,繪製相應的類圖。
3. 在某應用軟體中需要記錄業務方法的調用日誌,在不修改現有業務類的基礎上為每一個類提供一個日誌記錄代理類,在代理類中輸出日誌,如在業務方法Method()調用之前輸出“方法Method()被調用,調用時間為2012-11-5 10:10:10”,調用之後如果沒有拋異常則輸出“方法Method()調用成功”,否則輸出“方法Method()調用失敗”。在代理類中調用真實業務類的業務方法,使用代理模式設計該日誌記錄模組的結構,繪製類圖並使用C#語言編程類比實現。
4. 某軟體公司欲開發一款基於C/S的網狀圖片查看器,具體功能描述如下:使用者只需在圖片查看器中輸入網頁URL,程式將自動將該網頁所有圖片下載到本地,考慮到有些網頁圖片比較多,而且某些圖片檔案比較大,因此將先以表徵圖的方式顯示圖片,不同類型的圖片使用不同的表徵圖,並且在表徵圖下面標註該圖片的檔案名稱,使用者單擊表徵圖後可查看真正的圖片,介面效果15-7所示。試使用虛擬代理模式設計並實現該圖片查看器。(註:可以結合多線程機制,使用一個線程顯示小表徵圖,同時啟動另一個線程在後台載入原圖。)
圖15-7 圖片查看器介面
【友情提示:建議大家有時間的話把這些練習都做一做,有問題歡迎討論!】
【作者:劉偉(Sunny) http://blog.csdn.net/lovelion】