常见的Java代理模式有哪些?

  • Post category:Java

常见的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类,然后分别实现了静态代理和动态代理两种方式。通过这两个示例,我们可以清楚地了解到代理模式的使用方式和应用场景。