Java代理模式是一種常見的設計模式,它允許您以代理的形式訪問某個對象。Java代理代表原始對象并向客戶端提供其所有功能。Java代理可以分為靜態代理和動態代理兩種類型,它們之間存在著一些重要的區別。
靜態代理
public interface Car { void drive(); } public class CarImpl implements Car { public void drive() { System.out.println("Driving the car..."); } } public class CarProxy implements Car { private Car car; public CarProxy(Car car) { this.car = car; } public void drive() { System.out.println("Before driving, check if the car is available."); car.drive(); System.out.println("After driving, refueling is required."); } } public class Main { public static void main(String[] args) { Car car = new CarProxy(new CarImpl()); car.drive(); } }
靜態代理可以在編譯期間生成代理類,代理類和委托類都實現同一接口,委托類實現業務邏輯方法,而代理類通常在業務邏輯方法前或后添加一些邏輯操作,如權限控制、事務處理等。
動態代理
public interface Car { void drive(); } public class CarImpl implements Car { public void drive() { System.out.println("Driving the car..."); } } public class CarHandler implements InvocationHandler { private Object target; public CarHandler(Object target) { this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before driving, check if the car is available."); Object result = method.invoke(target, args); System.out.println("After driving, refueling is required."); return result; } } public class Main { public static void main(String[] args) { Car car = (Car) Proxy.newProxyInstance(Car.class.getClassLoader(), new Class[]{Car.class}, new CarHandler(new CarImpl())); car.drive(); } }
動態代理不需要在編譯期間生成代理類,代理類是在程序運行期間動態生成的,通過反射機制實現。動態代理通常不需要像靜態代理一樣手動編寫代理類,只需要實現InvocationHandler類,實現invoke方法,在該方法中調用委托類的方法,并在方法前后添加邏輯操作。
總體來說,靜態代理適用于只有少量對象需要代理的情況下,因為每個委托類都需要編寫一個代理類,而動態代理適用于代理對象較多的情況,因為它可以動態生成代理類,簡化了代理類的開發。