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

深入淺出Java代理設計模式:原理、分類與實戰

     編輯:Java 程式設計入門

引言:生活中的代理模式

逛電腦市場升級硬體時,資深DIY玩家偏好尋找代理商——不僅產品品質有保障,價格與售後服務也更具優勢。客戶透過代理商獲得商品與額外服務,廠商則將銷售服務外包給代理商,專注於產品研發。這雙贏模式在美國甚至成為商品上市的法定環節,可見代理角色在商業運作中的關鍵地位。

在物件導向程式設計中,代理模式扮演著同樣重要的角色。當客戶端不想或無法直接引用目標物件時,代理物件作為中介,可過濾不需暴露的內容、增強額外服務,完美詮釋了「為其他物件提供代理以控制對其存取」的設計意圖。

何時使用代理模式?

面對既有方法需改進的情境,有兩種選擇:

  1. 直接修改原方法——違反「開放封閉原則」,易導致類別功能模糊、多元化
  2. 引入「第三者」代理方法調用原方法並控制結果——功能劃分清晰,利於後期維護

雖然小型系統使用代理可能顯得臃腫,但在中大型系統中,代理模式能有效分離關注點,提升系統彈性。

代理模式的常見分類

根據《Java與模式》分類,代理模式主要包含以下四種常見類型:

類型說明應用場景
遠程代理為不同位址空間的物件提供本地代表RMI、Web Service呼叫
虛擬代理延遲建立資源消耗大的物件大圖片載入、文件緩載
保護代理控制物件存取權限論壇權限管理、API存取控制
智能引用代理提供額外服務訪問計數、快取管理、記憶體優化

代理模式結構與角色

代理模式包含三個核心角色:

  1. 抽象主題角色:聲明真實主題與代理主題的共同介面(建議使用Java介面)
  2. 代理主題角色:持有真實主題引用,實現相同介面,控制存取並可增強功能
  3. 真實主題角色:定義真實業務邏輯的物件

代理模式類別圖

實戰範例:論壇發文權限控制

以論壇系統為例,註冊用戶可發文、修改資料,遊客僅可瀏覽。簡化實現發文權限控制:

// 抽象主題介面
public interface MyForum {
    void postArticle(String content);
}

// 真實主題
public class RealForum implements MyForum {
    public void postArticle(String content) {
        System.out.println("發文內容:" + content);
        // 實際資料庫操作...
    }
}

// 代理主題
public class ForumProxy implements MyForum {
    private RealForum realForum;
    private User currentUser;
    
    public ForumProxy(User user) {
        this.currentUser = user;
        this.realForum = new RealForum();
    }
    
    public void postArticle(String content) {
        if (currentUser.isRegistered()) {
            realForum.postArticle(content);
        } else {
            System.out.println("遊客無發文權限!");
        }
    }
}

此範例展示代理如何在不修改真實主題的前提下,靈活控制存取權限,完美體現代理模式的核心價值。

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