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

Java 代理模式完全指南:靜態/動態、普通/強制、九大應用場景

     編輯:Java 相關知識

模式定義

代理模式:為其他對象提供一個代理,以控制對該對象的訪問。核心三角色:

  • Subject(抽象主題):定義公共業務介面
  • RealSubject(真實主題):業務邏輯實現者
  • Proxy(代理主題):持有真實主題引用,控制訪問、增強功能

通用代碼結構

public interface Subject { void doSomething(); }
public class RealSubject implements Subject { 
    public void doSomething() { System.out.println("業務邏輯..."); } 
}
public class Proxy implements Subject {
    private Subject real;
    public Proxy(Subject real) { this.real = real; }
    public void doSomething() { 
        // 前置增強
        real.doSomething(); 
        // 後置增強
    }
}

兩種代理模式變體

1. 普通代理

客戶端只知代理,不知真實主題。代理構造器中創建真實主題:

public class Proxy implements Subject {
    private RealSubject real = new RealSubject(); // 內部創建
    public void doSomething() { real.doSomething(); }
}

2. 強制代理

必須通過真實主題獲取代理,真實主題不直接對外暴露:

public class RealSubject implements Subject {
    public Subject getProxy() { return new Proxy(this); } // 只能通過此法獲取代理
    public void doSomething() { 
        if (proxy != null) System.out.println("被代理執行..."); 
        else System.out.println("請先訪問代理..."); 
    }
}

九大經典應用場景

類型核心作用典型例子
遠程代理隱藏網絡通訊細節RPC、RMI、Dubbo
虛擬代理延遲創建開銷大對象圖片懒加載、大文件預覽
複製代理寫時復制,延遲克隆CopyOnWriteArrayList
保護代理權限控制,不同角色不同權限Spring Security、數據庫視圖
緩存代理緩存計算結果,共享複用Hibernate 二級緩存、Guava Cache
防火牆代理過濾惡意請求API 閘關、WAF
同步代理多線程安全訪問Collections.synchronizedList
智能引用代理引用計數、訪問日誌引用計數 GC、訪問統計
複雜隱藏代理隱藏系統複雜度,統一入口外觀模式變體、微服務網關

Spring AOP:代理模式的巔峰應用

  • JDK 動態代理:基於介面,InvocationHandler 攔截
  • CGLIB 代理:繼承目標類,重寫方法(無介面也可代理)
  • 實現切面邏輯與業務邏輯分離:事務、日誌、權限、性能監控

總結

代理模式是控制訪問、增強功能、解耦關注點的利器。靜態代理代碼固定,動態代理(JDK/CGLIB/ByteBuddy)運行時生成字節碼更靈活。實戰中優先使用成熟框架(Spring AOP),手寫代理僅用於學習或極簡場景。理解九大場景有助於識別何時引入代理。

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