代理模式 屬於結構型模式。它為其他對象提供一種代理,以控制對這個對象的訪問。代理類和真實主題類實現相同的接口,客戶端通過代理間接操作真實對象。
模擬 Jive 論壇系統:Forum 接口定義操作,DbForum 真實實現,ForumProxy 根據 ForumPermissions 檢查權限。
// 接口
public interface Forum {
void setName(String name) throws UnauthorizedException;
// ... 其他操作
}
// 真實主題
public class DbForum implements Forum {
private String name;
@Override
public void setName(String name) throws ForumAlreadyExistsException {
this.name = name;
saveToDb(); // 真正持久化
}
}
// 代理:權限檢查
public class ForumProxy implements Forum {
private Forum forum;
private ForumPermissions permissions;
public ForumProxy(Forum forum, ForumPermissions permissions) {
this.forum = forum;
this.permissions = permissions;
}
@Override
public void setName(String name) throws UnauthorizedException {
// 僅系統管理員或版塊管理員可修改名稱
if (permissions.isSystemOrForumAdmin()) {
forum.setName(name);
} else {
throw new UnauthorizedException("無權限修改版塊名稱");
}
}
}
文檔編輯器中,圖片佔用內存大。代理類持有文件路徑,僅在 paint() 繪製時才真正加載 ImageIcon。
多線程並發讀取大集合(如 Hashtable),某線程需長時間遍歷。直接加鎖會阻塞寫入;深拷貝開銷大。解決方案:代理持有原集合引用,僅當其他線程修改集合時(put/remove),才觸發真實拷貝(Copy-on-Write),讀線程操作副本,寫線程操作原件,實現無鎖讀、延遲拷貝。
Java 提供 java.lang.reflect.Proxy 和 InvocationHandler 實現動態代理,無需手寫代理類。廣泛應用於 Spring AOP、RPC 框架、MyBatis Mapper 等。
代理模式通過引入中間層,實現了訪問控制、功能增強、資源延遲加載等關注點分離,是框架設計中極其重要的模式。