大纲
静态代理的介绍
静态代理是 Java 中的一种设计模式,用于为目标对象提供额外的功能或控制访问目标对象的操作。它的基本思想是通过创建一个代理类,代理类具有与目标对象相同的接口或方法,并在代理类的方法中调用目标对象的对应方法。代理类可以在调用目标对象方法的前后添加额外的逻辑,比如权限检查、日志记录、事务处理等。
静态代理的关键点
- 代理类和目标对象实现相同的接口:代理类和目标对象都实现同一个接口,这样客户端可以通过代理类来间接调用目标对象的方法。
- 代理类控制对目标对象的访问:代理类持有目标对象的引用,并在实现接口方法时调用目标对象的对应方法。同时,代理类可以在调用目标对象的方法前后添加一些额外的操作。
- 静态代理是编译时确定的:代理类的代码是静态定义的,也就是说代理类的结构在编译时就已经确定了,因此称为静态代理。
静态代理的优点
- 控制访问:可以在不修改目标对象代码的情况下控制对目标对象的访问。
- 增强功能:可以在代理类中增加额外的功能,例如日志记录、安全检查等。
静态代理的缺点
- 代码冗余:每一个目标类都需要一个对应的代理类,这会导致代码量增多,维护起来不方便。
- 不灵活:由于代理类和目标类是静态绑定的,所以无法动态地为不同的目标类生成代理类。
静态代理的使用
1 2 3 4 5
| public interface PayService {
public void pay();
}
|
1 2 3 4 5 6 7 8
| public class PayServiceImpl implements PayService {
@Override public void pay() { System.out.println("正在处理支付业务 ..."); }
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| public class PayProxy implements PayService {
private PayService payService;
public PayProxy(PayService payService) { this.payService = payService; }
public void before() { System.out.println("-----before,开始支付"); }
@Override public void pay() { before(); payService.pay(); after(); }
public void after() { System.out.println("-----after,完成支付"); }
}
|
1 2 3 4 5 6 7 8
| public class PayTest {
public static void main(String[] args) { PayService payService = new PayProxy(new PayServiceImpl()); payService.pay(); }
}
|
程序运行后输出的结果:
1 2 3
| -----before,开始支付 正在处理支付业务 ... -----after,完成支付
|