代理模式(Proxy Pattern)是一种结构型设计模式,用于为其他对象提供一个代替或占位符以控制对它的访问。代理可以在客户端和目标对象之间起到中介的作用,这样在某些情况下可以延迟对象的创建,或者在访问对象时添加额外的功能。
代理模式包含以下几个关键角色:
- Subject(主题接口) :定义了真实主题和代理共同实现的接口。
- RealSubject(真实主题) :定义了代理所代表的真实对象,实现了主题接口。
- Proxy(代理) :包含对真实主题的引用,实现了和真实主题相同的接口,并在访问真实主题之前或之后添加额外的处理。
代理模式的典型代码结构如下:
// 主题接口
interface Subject {
void request();
}
// 真实主题
class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject: Handling request.");
}
}
// 代理
class Proxy implements Subject {
private RealSubject realSubject;
public Proxy() {
this.realSubject = null;
}
public void request() {
if (realSubject == null) {
realSubject = new RealSubject();
}
realSubject.request();
// 可以添加额外的处理逻辑
}
}
使用代理模式的示例:
public class ProxyDemo {
public static void main(String[] args) {
Subject proxy = new Proxy();
proxy.request(); // 代理对象处理请求
}
}
输出结果:
RealSubject: Handling request.
代理模式的优点包括:
- 控制访问:可以在访问真实主题之前或之后添加控制逻辑。
- 延迟初始化:可以在真正需要时才创建真实主题对象,节省资源。
- 增加额外功能:可以在不修改真实主题的情况下,通过代理添加额外的功能。
代理模式的缺点包括:
- 增加复杂性:每增加一个代理,就需要增加一个代理类。
- 降低性能:代理模式可能会增加系统的性能开销。
代理模式适用于以下场景:
- 当需要控制对某个对象的访问时。
- 当需要为远程对象、或者创建开销较大的对象提供代表时。
- 当需要通过代理来提供额外的功能,如日志记录、访问控制等。
代理模式有几种变体:
- 远程代理:为远程对象提供代理,隐藏对象位于不同地址空间的事实。
- 虚拟代理:延迟创建开销较大的对象。
- 保护代理:控制对原始对象的访问权限。
- 智能引用:在访问对象时执行额外操作,如引用计数、线程安全等。