如同現實中的代理商:客戶不直接面對廠商,代理商提供質保、售後、權限控制等增值服務,廠商專注生產。軟件中,代理模式為目標對象提供代理,控制訪問,在不修改原類前提下增強功能(符合開閉原則)。
| 類型 | 場景 | 例子 |
|---|---|---|
| 遠程代理 | 跨進程/網絡調用 | RMI Stub、Web Service Proxy |
| 虛擬代理 | 延遲創建昂貴對象 | 大圖片延遲加載、文檔佔位符 |
| 保護代理 | 訪問權限控制 | 論壇會員/遊客權限區分 |
| 智能引用代理 | 附加額外服務 | 訪問計數、日誌記錄、緩存 |
適用判斷:系統較小、邏輯簡單時直接修改更高效;功能擴展頻繁、需解耦時代理模式優勢明顯。

// 抽象主題
public interface MyForum { void addPost(); }
// 真實主題
public class RealMyForum implements MyForum {
public void addPost() { System.out.println("發帖成功!"); }
}
// 代理主題
public class MyForumProxy implements MyForum {
private RealMyForum real = new RealMyForum();
private int permission; // 0:遊客 1:會員
public MyForumProxy(int permission) { this.permission = permission; }
public void addPost() {
if (permission == 1) real.addPost();
else System.out.println("請先註冊成為會員!");
}
}
可擴展:統計瀏覽量、記錄登錄日誌等(智能引用)。
瀏覽器訪問網頁時,代理先用線程加載縮略圖顯示;後台另一線程加載原圖並緩存至本地;用戶點擊時若原圖就緒則新頁顯示,否則顯示「加載中」。
核心價值:將耗時操作移至後台,不阻塞前台渲染,提升用戶體驗。
代理模式協調調用者與被調用者,降低耦合。但需謹記適用條件:需對原有方法增強/控制,且不願修改原類。濫用會導致類爆炸、調用鏈過長,得不償失。