代理模式的核心優勢在於隱藏真實類(委托類),提高安全性。靜態代理與動態代理的本質區別在於代理類的生成時機:

public interface ITest {
void addStudent(String name);
}
public class Test implements ITest {
@Override
public void addStudent(String name) {
System.out.println("學生姓名:" + name);
try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); }
}
}
public class ProxyTest implements ITest {
private Test delegate;
public ProxyTest(Test delegate) { this.delegate = delegate; }
@Override
public void addStudent(String name) {
long start = System.currentTimeMillis();
delegate.addStudent(name);
long end = System.currentTimeMillis();
System.out.println("執行任務耗時 " + (end - start) + " 毫秒");
}
}
public class TestFactory {
public static ITest getInstance() {
return new ProxyTest(new Test());
}
}
public class Client {
public static void main(String[] args) {
ITest proxy = TestFactory.getInstance();
proxy.addStudent("好學生");
}
}
| 優點 | 業務類只關注業務邏輯,保證重用性 |
|---|---|
| 缺點 | 1. 一個接口只服務一種類型對象 2. 接口新增方法需修改所有實現類和代理類,維護成本高 |
動態代理類父類,提供靜態方法生成代理類及實例:
getInvocationHandler(Object proxy)getProxyClass(ClassLoader loader, Class[] interfaces)isProxyClass(Class cl)newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)Object invoke(Object proxy, Method method, Object[] args)
集中處理動態代理對象上的所有方法調用,通常實現委托類的代理訪問。
負責將動態生成的字節碼裝載到 JVM,與普通類區別在於字節碼運行時生成而非預存 .class 文件。