面试题答案
一键面试代理模式使用场景
- 远程代理:当需要访问远程对象时,由于网络等原因,直接访问可能不现实。比如,调用远程服务器上的服务,本地代码通过代理对象来代表远程对象,处理网络连接、数据传输等细节。例如,调用其他公司提供的远程接口获取数据,就可以使用远程代理。
- 虚拟代理:如果创建一个对象开销很大(比如加载大文件、数据库连接等),可以先创建一个轻量级的代理对象,只有在真正需要时才创建实际对象。比如,在图形绘制中,加载高分辨率图片,一开始可以先使用代理对象占位,当用户真正查看图片时再加载实际图片。
- 安全代理:用于控制对真实对象的访问权限。例如,在一个系统中,不同用户有不同的权限访问某些资源,通过代理对象可以检查用户权限,只有有权限的用户才能访问实际对象。
代理模式结构
- 抽象主题(Subject):定义了真实主题和代理主题的共同接口,这样在任何使用真实主题的地方都可以使用代理主题。
- 真实主题(RealSubject):实现了抽象主题接口,定义了代理对象所代表的真实对象,是最终要访问的对象。
- 代理主题(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
的实例。在 Proxy
的 request
方法中,在调用 RealSubject
的 request
方法前后添加了额外的处理逻辑。在 main
方法中,通过代理对象调用 request
方法,就实现了静态代理。