代理模式
代理模式是一种常用的设计模式,它通过为一个对象提供一个代理对象来控制对原对象的访问。在Java语言中,代理模式主要有三种实现方式:静态代理、动态代理和Cglib代理。
静态代理
静态代理是指在编码阶段就确定了代理类和被代理类之间的关系。静态代理通常需要手动编写代理类,并且需要实现与被代理类相同的接口。
下面是一个简单的静态代理示例:
interface Subject {
void request();
}
class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject request");
}
}
class ProxySubject implements Subject {
private RealSubject realSubject;
public ProxySubject(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public void request() {
System.out.println("ProxySubject preRequest");
realSubject.request();
System.out.println("ProxySubject postRequest");
}
}
public class StaticProxyDemo {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
ProxySubject proxySubject = new ProxySubject(realSubject);
proxySubject.request();
}
}
动态代理
动态代理是指在运行时动态生成代理类。Java语言提供了java.lang.reflect.Proxy
类来支持动态代理。
下面是一个简单的动态代理示例:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Subject {
void request();
}
class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject request");
}
}
class DynamicProxyHandler implements InvocationHandler {
private Object target;
public DynamicProxyHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("DynamicProxy preRequest");
Object result = method.invoke(target, args);
System.out.println("DynamicProxy postRequest");
return result;
}
}
public class DynamicProxyDemo {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
Subject proxy = (Subject) Proxy.newProxyInstance(
realSubject.getClass().getClassLoader(),
realSubject.getClass().getInterfaces(),
new DynamicProxyHandler(realSubject));
proxy.request();
}
}
Cglib代理
Cglib是一个第三方库,它可以在运行时动态生成子类来实现代理。Cglib代理不需要被代理类实现接口,因此它可以用来代理没有实现接口的类。
下面是一个简单的Cglib代理示例:
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
class RealSubject {
public void request() {
System.out.println("RealSubject request");
}
}
class CglibProxyInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("CglibProxy preRequest");
Object result = proxy.invokeSuper(obj, args);
System.out.println("CglibProxy postRequest");
return result;
}
}
public class CglibProxyDemo {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(RealSubject.class);
enhancer.setCallback(new CglibProxyInterceptor());
RealSubject proxy = (RealSubject) enhancer.create();
proxy.request();
}
}
以上就是关于Java语言中设计模式的代理模式的简单介绍,希望对您有所帮助。