静态代理过程比较简单直接,直接借用网上流行的UserDao例子
首先定义一个UserDao接口
package com.lihuia.proxy;
/**
* Copyright (C), 2018-2019
* FileName: UserDao
* Author: lihui
* Date: 2019/2/1
*/
public interface UserDao {
void save();
}
然后实现这个接口,其中实现类里直接将接口里的方法实现
package com.lihuia.proxy;
/**
* Copyright (C), 2018-2019
* FileName: UserDaoImpl
* Author: lihui
* Date: 2019/2/1
*/
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("----已经保存数据!----");
}
}
最后创建一个代理类同样也实现这个接口,但是代理类实现的方法里直接调用接口方法
package com.lihuia.proxy;
/**
* Copyright (C), 2018-2019
* FileName: UserDaoProxy
* Author: lihui
* Date: 2019/2/1
*/
public class UserDaoProxy implements UserDao {
private UserDao target;
public UserDaoProxy(UserDao target){
this.target=target;
}
@Override
public void save() {
target.save();
}
}
如此一来,假如想调用接口中的方法,可以直接调用代理类的方法即可,具体实现类隐藏起来
如果要进行测试,可以新建一个测试类
package com.lihuia.proxy;
import org.testng.annotations.Test;
/**
* Copyright (C), 2018-2019
* FileName: UserDaoProxyTest
* Author: lihui
* Date: 2019/2/1
*/
public class UserDaoProxyTest {
@Test
public void saveTest() {
UserDaoImpl target = new UserDaoImpl();
UserDaoProxy proxy = new UserDaoProxy(target);
proxy.save();
}
}
调用代理类的save方法,构造方法UserDaoProxy传了一个target参数,UserDaoImpl类型,赋给了UserDao类型的引用,因此代理类里的save方法里调用的save方法,调用的就是实现类里的save方法打印已经保存数据
静态代理,可以不修改UserDaoImpl目标类,通过更新UserDaoProxy代理类来扩展功能,save方法里新增即可;但是代理类必须和实现类同时实现接口,所以每一个实现类都会有一个代理类,只要接口里有变更方法,实现类和代理类必须同时都要更新