静态代理是一种设计模式
静态代理是一种设计模式,它在程序运行之前就由程序员创建代理类和目标对象,然后在程序运行时通过代理类来间接访问目标对象的方法。这种模式通常用于控制对目标对象的访问,提供额外的功能,如日志记录、访问控制、延迟初始化等。
静态代理的特点包括:
1. **代理类与目标对象实现相同的接口**:代理类和目标对象都实现同一个接口,或者代理类实现一个接口,目标对象实现该接口的另一个版本。
2. **代理类持有目标对象的引用**:代理类中包含一个指向目标对象的引用,通过这个引用可以调用目标对象的方法。
3. **在调用目标对象之前/之后添加额外操作**:代理类可以在调用目标对象的方法之前或之后添加一些额外的操作,如日志记录、权限检查等。
4. **静态定义**:代理类和目标对象的关系是在编译时就已经确定的,因此在程序运行时不会改变。
下面是一个简单的静态代理模式的Java代码示例:
“`java
// 目标接口
interface ITarget {
void performTask();
}
// 目标对象
class ConcreteTarget implements ITarget {
public void performTask() {
System.out.println(“执行任务”);
}
}
// 代理类
class Proxy implements ITarget {
private ITarget target;
public Proxy(ITarget target) {
this.target = target;
}
public void performTask() {
System.out.println(“代理类在执行任务之前的操作”);
target.performTask();
System.out.println(“代理类在执行任务之后的操作”);
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
ITarget target = new ConcreteTarget();
ITarget proxy = new Proxy(target);
proxy.performTask();
}
}
“`
在这个示例中,`ITarget` 是一个接口,`ConcreteTarget` 是实现了该接口的目标对象。`Proxy` 类是代理类,它也实现了 `ITarget` 接口,并持有一个 `ITarget` 类型的引用,指向目标对象。在 `Proxy` 类的 `performTask` 方法中,可以在调用目标对象的 `performTask` 方法之前和之后添加额外的操作。
静态代理模式的优点是简单易懂,缺点是不够灵活,每增加一个目标对象就需要增加一个代理类,这会导致类的数量急剧增加。因此,在实际应用中,动态代理模式(如Java中的`java.lang.reflect.Proxy`类)通常更受欢迎,因为它可以在运行时动态地创建代理对象。