代理模式(Proxy Pattern)是一种结构型设计模式,它允许你通过代理对象间接访问目标对象。代理对象在执行目标对象的行为时,可以在其前后加入额外的操作,比如权限控制、延迟加载、缓存等。这种设计模式非常适合于那些在特定条件下需要增强某个对象功能的场景。
代理模式的核心概念
代理模式主要包含以下几个关键角色:
- Subject(抽象主题角色):定义了代理类和真实类的公共接口,这样客户端就可以通过代理类来访问真实类。
- RealSubject(真实主题角色):实现了抽象主题接口,是我们实际想要使用的对象。
- Proxy(代理主题角色):实现了抽象主题接口,包含对真实对象的引用。通过这个引用,代理对象可以在执行真实对象的方法之前或者之后执行其他操作。
代理模式的类型
代理模式可以根据其行为方式分为几种不同的类型,包括:
- 静态代理:由程序员创建或由工具生成代理类的源码,再对其编译。在这种代理模式中,代理类和真实类都实现了相同的接口,代理类持有一个真实类的实例。
- 动态代理:在运行时创建的代理对象,通常借助于反射机制。动态代理通常不需要代理类和真实类实现相同的接口,它通过反射机制来实现方法调用。
静态代理的实现
在 Java 中,静态代理的实现相对直接。下面我们将通过一个简单的示例来展示静态代理的实现。
示例:静态代理模式的实现
// 抽象主题角色
public interface Service {
void request();
}
// 真实主题角色
public class RealService implements Service {
@Override
public void request() {
System.out.println("真实服务被请求");
}
}
// 代理主题角色
public class ProxyService implements Service {
private RealService realService;
public ProxyService(RealService realService) {
this.realService = realService;
}
@Override
public void request() {
System.