在 Java 中实现署理 模式通常包含 两种方法 :静态署理 和动态署理 。静态署理 是在编译时就已经确定署理 类和真实对象的关系,而动态署理 则是在运行时动态生成署理 类。下面,我会分别 解释如何在项目中实践这两种署理 模式。
静态署理
- 界说 接口:首先界说 一个接口,声明你想要署理 的办法 。
1public interface IService {2 void serve();3}1public class RealService implements IService {2 @Override3 public void serve() {4 System.out.println("Serving something important...");5 }6}
- 创建 署理 类:然后创建 一个署理 类,同样实现这个接口,并在内部持有一个真实对象的引用,署理 类可以在挪用 真实对象的办法 前后添加额外的逻辑。
1 public class ProxyService implements IService {2 private IService realService;34 public ProxyService(IService realService) {5 this.realService = realService;6 }78 @Override9 public void serve() {10 System.out.println("Proxy before serving...");11 realService.serve();12 System.out.println("Proxy after serving...");13 }14}
- 使用署理 :在客户端代码中,使用署理 类来替代真实对象。
1 public class Client {2 public static void main(String[] args) {3 IService realService = new RealService();4 IService proxyService = new ProxyService(realService);5 6 proxyService.serve();7 }8}动态署理
在Java中,动态署理 通常是通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现的。
- 界说 接口:这一步和静态署理 相同,你需要一个接口。
1public interface IService {2 void serve();3}1public class RealService implements IService {2 @Override3 public void serve() {4 System.out.println("Serving something important...");5 }6}
- 创建 挪用 处理 器:创建 一个InvocationHandler,它界说 了署理 实例的挪用 处理 法度模范 。
1public class ProxyInvocationHandler implements InvocationHandler {2 private Object target;34 public ProxyInvocationHandler(Object target) {5 this.target = target;6 }78 @Override9 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {10 System.out.println("Invoking method: " + method.getName());11 Object result = method.invoke(target, args);12 System.out.println("Method executed: " + method.getName());13 return result;14 }15}
- 使用动态署理 :在客户端代码中,创建 真实对象的署理 实例,并通过它挪用 办法 。
1public class Client {2 public static void main(String[] args) {3 IService realService = new RealService();4 IService proxyService = (IService) Proxy.newProxyInstance(5 realService.getClass().getClassLoader(),6 new Class[] { IService.class },7 new ProxyInvocationHandler(realService)8 );9 10 proxyService.serve();11 }12}在上面的动态署理 例子中,Proxy.newProxyInstance办法 创建 了一个实现了IService接口的署理 实例,所有对该署理 实例的办法 挪用 都邑 被转发到ProxyInvocationHandler.invoke办法 。
这些是署理 模式在Java项目中的基本实践。在实际的项目中,署理 模式经常 用于拜访 控制、懒加载、日志记录、性能计数、事务处理 等场景。 |