什么是静态代理?请举例说明其应用场景和实现方式。
静态代理是实现代理模式的一种方式,它要求程序员手动创建代理类。在静态代理中,代理类和目标对象实现相同的接口或继承相同的类,然后在代理类中显式地调用目标对象的方法,同时可以在调用之前或之后添加自己的处理逻辑。
静态代理的步骤通常包括:
- 定义一个接口,声明你需要代理的方法。
- 创建一个目标对象类,实现上述接口,并实现具体的业务逻辑。
- 创建一个代理类,也实现上述接口。在代理类内部,创建一个目标对象的引用,并通过构造方法传入一个目标对象。
- 在代理类的方法中,调用目标对象的方法,并在调用前后可以进行一些附加操作。
这种方式的缺点是每一个代理类只能服务于一种类型的对象,如果需要代理的方法很多,那么代理类也会变得非常庞大。此外,一旦接口增加方法,代理类和目标对象类都需要进行修改。
举个例子,假设有一个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
代码的情况下,增加了额外的功能。