常见的Java代理模式有哪些?
代理模式
代理模式是指一个类代表另一个类的功能,常见的使用场景是在访问对象时进行一些额外的控制,比如限制访问、增加访问次数等。
静态代理模式
静态代理模式中需要定义一个接口或者抽象类,代理类和实际类实现此接口或者继承此抽象类。代码示例如下:
public interface Subject {
void request();
}
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("真实的请求");
}
}
public class ProxySubject implements Subject {
private RealSubject realSubject;
public ProxySubject(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public void request() {
System.out.println("代理前置操作");
realSubject.request();
System.out.println("代理后置操作");
}
}
public class Client {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
ProxySubject proxySubject = new ProxySubject(realSubject);
proxySubject.request();
}
}
动态代理模式
动态代理模式是通过反射创建真实类的代理对象,该代理类在运行时动态创建。使用动态代理模式可以减少代码量,提高灵活性。代码示例如下:
public interface Subject {
void request();
}
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("真实的请求");
}
}
public class DynamicProxy implements InvocationHandler {
private Object object;
public DynamicProxy(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(object, args);
System.out.println("代理前置操作");
System.out.println("代理后置操作");
return result;
}
}
public class Client {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
DynamicProxy proxy = new DynamicProxy(realSubject);
Subject subject = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(),
realSubject.getClass().getInterfaces(), proxy);
subject.request();
}
}
在以上示例中,我们定义了一个Subject
接口和一个RealSubject
类,然后分别实现了静态代理和动态代理两种方式。通过这两个示例,我们可以清楚地了解到代理模式的使用方式和应用场景。