首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 設計模式之代理模式介紹

     編輯:Java 相關知識

代理模式:為其他對象提供代理,控制訪問

代理模式 屬於結構型模式。它為其他對象提供一種代理,以控制對這個對象的訪問。代理類和真實主題類實現相同的接口,客戶端通過代理間接操作真實對象。

四種常見代理類型

  1. 遠程代理:為不同地址空間的對象提供本地代表(如 RMI、RPC)。
  2. 虛擬代理:按需創建開銷大的對象(如大圖片加載、延遲加載)。
  3. 保護代理:控制對原始對象的訪問權限(如論壇權限管理)。
  4. 智能引用代理:訪問對象時執行額外操作(如引用計數、線程安全、Copy-on-Write)。

案例一:保護代理 — 論壇權限控制

模擬 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。

案例三:Copy-on-Write 代理 — 延遲拷貝優化

多線程並發讀取大集合(如 Hashtable),某線程需長時間遍歷。直接加鎖會阻塞寫入;深拷貝開銷大。解決方案:代理持有原集合引用,僅當其他線程修改集合時(put/remove),才觸發真實拷貝(Copy-on-Write),讀線程操作副本,寫線程操作原件,實現無鎖讀、延遲拷貝。

JDK 動態代理

Java 提供 java.lang.reflect.Proxy 和 InvocationHandler 實現動態代理,無需手寫代理類。廣泛應用於 Spring AOP、RPC 框架、MyBatis Mapper 等。

總結

代理模式通過引入中間層,實現了訪問控制、功能增強、資源延遲加載等關注點分離,是框架設計中極其重要的模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved