MST

星途 面试题库

面试题:Java中代理模式在实际项目中的应用场景

请举例说明在Java项目里,代理模式通常会在哪些场景下被使用,并且简单描述代理模式的结构以及Java中如何通过代码实现静态代理。
28.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

代理模式使用场景

  1. 远程代理:当需要访问远程对象时,由于网络等原因,直接访问可能不现实。比如,调用远程服务器上的服务,本地代码通过代理对象来代表远程对象,处理网络连接、数据传输等细节。例如,调用其他公司提供的远程接口获取数据,就可以使用远程代理。
  2. 虚拟代理:如果创建一个对象开销很大(比如加载大文件、数据库连接等),可以先创建一个轻量级的代理对象,只有在真正需要时才创建实际对象。比如,在图形绘制中,加载高分辨率图片,一开始可以先使用代理对象占位,当用户真正查看图片时再加载实际图片。
  3. 安全代理:用于控制对真实对象的访问权限。例如,在一个系统中,不同用户有不同的权限访问某些资源,通过代理对象可以检查用户权限,只有有权限的用户才能访问实际对象。

代理模式结构

  1. 抽象主题(Subject):定义了真实主题和代理主题的共同接口,这样在任何使用真实主题的地方都可以使用代理主题。
  2. 真实主题(RealSubject):实现了抽象主题接口,定义了代理对象所代表的真实对象,是最终要访问的对象。
  3. 代理主题(Proxy):持有一个对真实主题对象的引用,实现了抽象主题接口,在调用真实主题的方法前后可以添加额外的处理逻辑。

Java中静态代理代码实现

// 抽象主题接口
interface Subject {
    void request();
}

// 真实主题类
class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("真实主题执行请求");
    }
}

// 代理主题类
class Proxy implements Subject {
    private RealSubject realSubject;

    public Proxy(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public void request() {
        System.out.println("代理主题预处理");
        realSubject.request();
        System.out.println("代理主题后处理");
    }
}

// 测试类
public class StaticProxyTest {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        Proxy proxy = new Proxy(realSubject);
        proxy.request();
    }
}

在上述代码中,Subject 是抽象主题接口,RealSubject 是真实主题类实现了该接口,Proxy 是代理主题类同样实现了该接口,并持有 RealSubject 的实例。在 Proxyrequest 方法中,在调用 RealSubjectrequest 方法前后添加了额外的处理逻辑。在 main 方法中,通过代理对象调用 request 方法,就实现了静态代理。