1.静态代理的概念:
静态代理是指,代理类在程序运行前就已经定义好,其与目标类的关系在程序运行前已经确立。
静态代理类似于企业与企业的法律顾问间的关系,法律顾问与企业的代理关系,并不是在“官司”发生后才建立的,而是之前就确立好的一种关系
2.代理的实现与解析:
静态代理实现转账:
(1.)定义业务接口IAccountService,其中含有抽象方法transfer();
public interface IAccountService {
//主业务逻辑:转账
void transfer();
}
(2.)定义目标类IAccountServiceImpl,该类实现了业务接口,在对接口方法的实现上,只实现主业务逻辑转账即可,这个方法称为目标方法
public class IAccountServiceImpl implements IAccountService {
/**
* 目标方法
*/
@Override
public void transfer() {
System.out.println("调用Dao层,完成转账主业务");
}
}
(3.)定义代理类IAccountServiceImplProxy,这个类要实现接口IAccountService,并且该代理类要将接口对象作为一个成员变量,还要定义一个带参的构造器,这个参数为接口对象,目的是,将目标对象引入代理类,以便代理类调用目标类的目标方法
/**
* 定义代理类,与目标类的实现相同的业务接口
*/
public class IAccountServiceImplProxy implements IAccountService{
//声明业务接口对象
private IAccountService target;
public IAccountServiceImplProxy(){};
//业务接口对象作为构造器参数,用户接收目标对象
public IAccountServiceImplProxy(IAccountService target){
this.target = target ;
}
/**
* 代理方法,实现对目标类的增强
*/
@Override
public void transfer() {
//此处为对目标类的增强
System.out.println("对转账人身份的验证!");
target.transfer();
}
}
(4.)定义客户类Client,在客户类中首先要创建目标对象,再创建代理对象,并使用目标对象对其进行初始化。然后有代理对象对其进行初始化,然后就有代理对象来调用执行业务方法。
public class MyTest {
public static void main(String[] args) {
//创建目标对象
IAccountService target = new IAccountServiceImpl();
//创建代理对象,并使用目标对象初始化它
IAccountService service = new IAccountServiceImplProxy(target);
//此时执行的内容,就是对目标对象增加过的内容
service.transfer();
}
}