「為其他對象提供一種代理以控制對這個對象的訪問。」—— GoF《設計模式》
核心角色:
代理類由程式設計師建立或工具生成,.class 檔案編譯期即存在。結構清晰、無反射開銷,但一個真實主題對應一個代理類,擴展性受限。
Subject (介面)
▲
├──────────────────┐
│ │
RealSubject Proxy
(核心業務) (增強+委託)
// 1. 抽象主題
public interface Subject {
void operation();
}
// 2. 真實主題
public class RealSubject implements Subject {
@Override
public void operation() {
System.out.println("執行核心業務邏輯...");
}
}
// 3. 靜態代理
public class Proxy implements Subject {
private final Subject realSubject; // 組合而非繼承
public Proxy(Subject realSubject) {
this.realSubject = realSubject;
}
@Override
public void operation() {
preProcess(); // 前置增強:日誌、權限、計時、快取
realSubject.operation(); // 委託真實主題
postProcess(); // 後置增強:結果包裝、指標上報、資源釋放
}
private void preProcess() { System.out.println("[Proxy] 前置處理:權限校驗、記錄入參"); }
private void postProcess() { System.out.println("[Proxy] 後置處理:耗時統計、返回值脫敏"); }
}
// 4. 客戶端使用
public class Client {
public static void main(String[] args) {
Subject real = new RealSubject();
Subject proxy = new Proxy(real);
proxy.operation(); // 透過代理間接呼叫
}
}
雖然靜態代理類爆炸,但可透過組合與介面分離構建可復用的代理積木:
2. 客戶端靈活組裝(裝飾器模式變體)