设计模式面试题, 什么是代理模式?一般用在什么场景?
设计模式面试题, 什么是代理模式?一般用在什么场景?
QA
Step 1
Q:: 什么是代理模式?
A:: 代理模式(Proxy Pattern)是一种结构型设计模式,它允许你在访问某个对象时提供一个替代对象来控制对这个对象的访问。代理对象可以在目标对象的基础上增加额外的功能,或者是在访问前后进行控制,比如权限校验、懒加载、缓存、日志记录等。代理模式主要有三种类型:静态代理、动态代理(如 Java 中的 JDK 动态代理)和 CGLIB 代理。
Step 2
Q:: 代理模式一般用在什么场景?
A:: 代理模式常用于以下场景:1)远程代理:为远程资源提供本地代理对象,比如调用远程服务时使用代理对象来处理网络通信;2)虚拟代理:为资源开销大的对象提供一个轻量级的代理,只有在真正需要时才创建对象;3)保护代理:控制对原始对象的访问权限,通过代理来检查用户权限;4
)智能代理:在访问目标对象时增加额外的操作,比如记录日志、统计方法调用次数等。
Step 3
Q:: 代理模式和装饰器模式有什么区别?
A:: 虽然代理模式和装饰器模式在结构上相似,但它们的目的和使用场景有所不同。代理模式的主要目的是控制对目标对象的访问,可以在不改变目标对象的情况下对其行为进行控制或扩展。而装饰器模式的主要目的是动态地给对象添加行为,是一种用于增强功能的设计模式。简单来说,代理模式侧重于控制,装饰器模式侧重于增强。
Step 4
Q:: 在 Java 中如何实现动态代理?
A:: 在 Java 中,可以通过 java.lang.reflect.Proxy
类和 InvocationHandler
接口实现动态代理。首先,创建一个实现 InvocationHandler
接口的类,并实现 invoke
方法,来定义代理对象调用目标方法时的行为。然后,通过 Proxy.newProxyInstance
方法创建代理对象,并将目标对象的方法委托给 InvocationHandler
。如果需要代理的是一个类而非接口,则可以使用 CGLIB 进行代理。
Step 5
Q:: 使用代理模式的优缺点是什么?
A:: 代理模式的优点包括:1)可以对目标对象进行控制,增加额外的操作(如日志记录、权限控制);2)使得客户端和目标对象解耦,增强了代码的可维护性;3)可以在不修改目标对象的前提下,动态地扩展对象功能。缺点包括:1)引入了额外的复杂性,增加了系统的开发和维护难度;2
)可能导致性能开销,特别是在使用动态代理时,由于反射机制的使用,会对性能产生一定影响。