什么是静态代理?请举例说明其应用场景和实现方式。

静态代理是实现代理模式的一种方式,它要求程序员手动创建代理类。在静态代理中,代理类和目标对象实现相同的接口或继承相同的类,然后在代理类中显式地调用目标对象的方法,同时可以在调用之前或之后添加自己的处理逻辑。

静态代理的步骤通常包括:

  1. 定义一个接口,声明你需要代理的方法。
  2. 创建一个目标对象类,实现上述接口,并实现具体的业务逻辑。
  3. 创建一个代理类,也实现上述接口。在代理类内部,创建一个目标对象的引用,并通过构造方法传入一个目标对象。
  4. 在代理类的方法中,调用目标对象的方法,并在调用前后可以进行一些附加操作。

这种方式的缺点是每一个代理类只能服务于一种类型的对象,如果需要代理的方法很多,那么代理类也会变得非常庞大。此外,一旦接口增加方法,代理类和目标对象类都需要进行修改。

举个例子,假设有一个Payment接口,它定义了pay方法,那么静态代理的步骤可能是这样的:

// 支付接口
public interface Payment {
    void pay();
}

// 目标对象类
public class RealPayment implements Payment {
    public void pay() {
        // 实现支付的具体逻辑
        System.out.println("支付金额");
    }
}

// 静态代理类
public class StaticPaymentProxy implements Payment {
    private Payment payment; // 持有一个对真实对象的引用

    public StaticPaymentProxy(Payment payment) {
        this.payment = payment;
    }

    public void pay() {
        // 在调用真实支付方法前后,添加一些逻辑,比如日志记录
        System.out.println("开始记录日志...");
        payment.pay(); // 调用真实支付方法
        System.out.println("结束记录日志...");
    }
}

// 使用代理类
public class Client {
    public static void main(String[] args) {
        Payment realPayment = new RealPayment();
        Payment proxy = new StaticPaymentProxy(realPayment);
        proxy.pay(); // 使用代理对象进行支付
    }
}

在上面的例子中,StaticPaymentProxy是静态代理类,它在执行pay方法时,增加了日志记录的功能。客户端通过代理类来进行支付操作,而不是直接使用RealPayment类,这样就在不修改RealPayment代码的情况下,增加了额外的功能。

发表评论

后才能评论