代理模式是結構型設計模式的一種,其核心思想是為某個對象提供一個代理對象,以控制對原對象的訪問。當客戶端不方便或不想直接引用目標對象時,代理對象便在兩者之間充當中介角色。靜態代理屬於代理模式的一種基礎形式,其特徵是在編譯時期就已確定代理類與目標類實現同一接口,並在代理方法中添加額外邏輯。
以下示例展示了如何通過實現共同接口 Hello 來構建靜態代理:
package com.ant;
public interface Hello {
void say();
}
package com.ant;
public class HelloImpl implements Hello {
@Override
public void say() {
System.out.println("Hello World!");
}
}
package com.ant;
public class StaticProxy implements Hello {
private Hello hello;
public StaticProxy(Hello hello) {
this.hello = hello;
}
@Override
public void say() {
System.out.println("StaticProxy: Welcome!");
hello.say(); // 委託給真實對象
}
}
package com.ant;
public class StaticProxyTest {
public static void main(String[] args) {
Hello hello = new HelloImpl();
StaticProxy proxy = new StaticProxy(hello);
proxy.say();
}
}
靜態代理雖然直觀,但其「一個目標類對應一個代理類」的硬性綁定關係,導致系統擴展困難。這正是動態代理(如 JDK 動態代理、CGLIB)誕生的動力——通過反射或字節碼技術在運行時動態生成代理類,解決接口變更帶來的連鎖修改問題,實現真正的解耦與復用。