在日常開發中,是否遇到過以下問題:
“程序啟動時圖片太多,加載太慢!”
“用戶還沒看到圖片就已經開始加載了,性能浪費!”
?
此時,代理模式(Proxy Pattern)便派上了用場。本文將以一個圖形界面中“延遲加載圖片”的經典例子,講解代理模式的核心思想與實際應用。
什么是代理模式?
代理模式為其他對象提供一種代理以控制對這個對象的訪問。常見的幾種代理有:
-
虛擬代理:根據需要創建開銷大的對象(比如圖片加載)。
-
保護代理:控制訪問權限。
-
遠程代理:為不同地址空間的對象提供局部代表。
示例場景:圖片延遲加載
設想你有一個圖形界面需要顯示大量圖片,但你不希望一開始就加載全部資源,而是當用戶真正滑動到該圖片位置時再加載。(延遲加載(Lazy Loading)指的是:等到真正需要某個對象或資源時,才去創建或加載它,從而節省資源或提升啟動速度。)
這就非常適合使用“虛擬代理”來優化性能。
?系統的框圖???????

簡單代碼結構解析
com.Proxy_Pattern
│
├── Image.java // 抽象主題接口
├── RealImage.java // 真實主題類
├── ProxyImage.java // 代理類
└── Test.java // 客戶端測試類
?抽象接口:Image.java
public interface Image {void display();
}
?定義一個圖片的通用接口,所有圖片類都必須實現該方法。
真實類:RealImage.java
public class RealImage implements Image {private String filename;public RealImage(String filename) {this.filename = filename;loadFromDisk();}private void loadFromDisk() {System.out.println("加載圖片:" + filename);}public void display() {System.out.println("顯示圖片:" + filename);}
}
這個類表示真正的圖片加載邏輯。構造函數中會加載圖片文件,相對開銷較大。
代理類:ProxyImage.java
public class ProxyImage implements Image {private String filename;private RealImage realImage;public ProxyImage(String filename) {this.filename = filename;}public void display() {if (realImage == null) {realImage = new RealImage(filename); // 延遲加載}realImage.display();}
}
該類是代理對象,延遲創建真正的 RealImage
實例。只有在第一次調用 display()
時,才會觸發真實的圖片加載。
測試代碼:Test.java
public class Test {public static void main(String[] args) {Image image = new ProxyImage("cat.jpg");System.out.println("第一次調用:");image.display(); // 第一次加載并顯示System.out.println("第二次調用:");image.display(); // 直接顯示(無需再加載)}
}
輸出實例

從輸出結果可以看到,圖片只在第一次顯示時被加載,第二次就直接顯示,無需重新加載,達到了“懶加載”的效果。
優勢總結
特點 | 描述 |
---|---|
延遲加載 | 圖片只在真正需要時才創建,節省資源 |
隱藏細節 | 客戶端無需關心加載邏輯,只調用 display() 即可 |
易擴展 | 可在代理中添加緩存、權限控制、日志記錄等功能 |
使用場景總結
你可以在以下場景中考慮使用代理模式:
-
圖像、視頻、音頻的懶加載
-
遠程調用接口的延遲訪問
-
安全控制,如保護資源的訪問
-
對資源訪問進行監控或統計
代理模式提供了一種在不修改原有類的前提下,增強功能的優雅方式。通過引入代理對象,我們實現了圖片的延遲加載,大大提升了程序的性能和響應速度。