团购网站推广怎么做,网站充值平台怎么做的,济源做网站的好公司,沧州商城网站建设Java代理模式详解
概念
代理模式是一种设计模式#xff0c;为其他对象提供一种代理以控制对这个对象的访问。在某些情况下#xff0c;一个对象不适合或者不能直接引用另一个对象#xff0c;而代理对象可以在客户端和目标对象之间起到中介的作用。在Java中#xff0c;代理…Java代理模式详解
概念
代理模式是一种设计模式为其他对象提供一种代理以控制对这个对象的访问。在某些情况下一个对象不适合或者不能直接引用另一个对象而代理对象可以在客户端和目标对象之间起到中介的作用。在Java中代理模式主要分为静态代理和动态代理。
静态代理
静态代理是在编译时就已经确定好代理类要代理谁。在静态代理中我们创建一个代理类来实现与目标对象相同的接口并在代理类中维护一个目标对象的引用。当客户端调用代理类的方法时实际上是通过代理类间接地调用目标对象的方法。
示例
假设我们有一个接口Subject和一个实现类RealSubject
public interface Subject {void request();
}public class RealSubject implements Subject {Overridepublic void request() {System.out.println(RealSubject: Handling request.);}
}接下来我们创建一个代理类ProxySubject它实现了Subject接口并持有一个RealSubject的实例
public class ProxySubject implements Subject {private RealSubject realSubject;public ProxySubject() {this.realSubject new RealSubject();}Overridepublic void request() {preRequest();realSubject.request();postRequest();}private void preRequest() {System.out.println(ProxySubject: Preparing request.);}private void postRequest() {System.out.println(ProxySubject: Request completed.);}
}在ProxySubject中我们在调用realSubject.request()之前和之后分别执行了一些额外的操作。这就是静态代理的一个典型用法在目标方法执行前后插入额外的逻辑。
动态代理
动态代理与静态代理的主要区别在于动态代理是在运行时动态地生成代理类。在Java中我们可以通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态代理。
示例
首先我们定义一个InvocationHandler的实现
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class DynamicProxyHandler implements InvocationHandler {private Object target;public DynamicProxyHandler(Object target) {this.target target;}Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {preRequest();Object result method.invoke(target, args);postRequest();return result;}private void preRequest() {System.out.println(DynamicProxyHandler: Preparing request.);}private void postRequest() {System.out.println(DynamicProxyHandler: Request completed.);}public static Object newInstance(Object target) {return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new DynamicProxyHandler(target));}
}然后我们可以这样使用动态代理
Subject realSubject new RealSubject();
Subject proxySubject (Subject) DynamicProxyHandler.newInstance(realSubject);
proxySubject.request();这段代码首先创建了一个RealSubject实例然后通过DynamicProxyHandler.newInstance()方法创建了一个代理对象。当我们调用proxySubject.request()时实际上会调用DynamicProxyHandler中的invoke()方法从而实现在目标方法执行前后插入额外的逻辑。
总结
代理模式在Java中主要有两种实现方式静态代理和动态代理。静态代理在编译时就已经确定好代理类要代理谁而动态代理则可以在运行时动态地生成代理类。这两种方式都可以实现在目标方法执行前后插入额外的逻辑但动态代理更加灵活和强大。