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

Java 設計模式實戰:計數代理模式

     編輯:Java 程式設計入門

模式動機

當客戶端呼叫服務提供者方法前後,需執行日誌記錄、效能計數、存取控制等橫切關注點時,若直接寫在服務類別內,會違反「單一職責原則」,導致程式碼耦合、難以維護。計數代理模式將這些附加功能封裝於獨立的代理物件,讓服務提供者專注核心業務邏輯。

模式結構

  • Service Interface (OrderIF):定義服務契約
  • Real Subject (Order):真實業務實作
  • Proxy (OrderProxy):實作相同介面,持有 Real Subject 參考,在轉呼叫前後執行附加邏輯
  • Client (MainApp):透過介面呼叫 Proxy,無感知 Real Subject

程式碼實作

1. 服務介面

public interface OrderIF {
    public Vector getAllOrders();
}

2. 真實服務類別

public class Order implements OrderIF {
    public Vector getAllOrders() {
        FileUtil fileUtil = new FileUtil();
        return fileUtil.fileToVector("orders.txt");
    }
}

3. 計數代理類別

public class OrderProxy implements OrderIF {
    private int counter = 0;

    public Vector getAllOrders() {
        Order order = new Order();
        counter++;
        long t1 = System.currentTimeMillis();
        Vector v = order.getAllOrders();
        long t2 = System.currentTimeMillis();
        long timeDiff = t2 - t1;
        String msg = "Iteration=" + counter + "::Time=" + timeDiff + "ms";
        // 記錄日誌
        FileUtil fileUtil = new FileUtil();
        fileUtil.writeToFile("log.txt", msg, true, true);
        return v;
    }
}

4. 客戶端呼叫

public class MainApp {
    public static void main(String[] args) {
        OrderIF order = new OrderProxy();
        Vector v = order.getAllOrders(); // 第 1 次
        v = order.getAllOrders();        // 第 2 次
        v = order.getAllOrders();        // 第 3 次
        v = order.getAllOrders();        // 第 4 次
    }
}

模式優勢

  1. 關注點分離:業務邏輯與日誌/計數分離
  2. 開放封閉原則:新增監控功能無需修改 Order 類別
  3. 可複用:同一 Proxy 可套用至多個服務類別
  4. 透明性:客戶端程式碼無需修改

應用場景

  • 方法呼叫次數統計
  • 執行時間效能監控
  • 存取日誌審計
  • 權限檢查、快取控制

延伸:動態代理

Java 反射機制 (java.lang.reflect.Proxy) 可在執行期動態產生代理類別,進一步解耦,適用於 AOP 框架(如 Spring AOP)的底層實作。

計數代理模式是「代理模式」的典型應用,展現「組合優於繼承」的設計智慧。

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