1. 静态代理
public interface IUserDao {
/**
* 保存文件
* @param fileName
*/
void save(String fileName);
}
/**
* 目标对象
*/
public class MyDao implements IUserDao {
@Override
public void save(String fileName) {
System.out.println("我来保存文件");
}
}
/**
* 代理对象
*/
public class MyProxyDao implements IUserDao {
MyDao myDao;
public MyProxyDao(MyDao myDao){
this.myDao = myDao;
}
@Override
public void save(String fileName) {
System.out.println("保存文件,先给10块钱!");
myDao.save(fileName);
}
}
/**
* 静态代理:代理对象与被代理对象都要实现相同的接口或者继承相同的父类
* 因为代理对象与被代理对象都要实现相同的接口,所以会出现很多代理类,并且如果接口有变更那么
* 两者 都要做出维护,实现类越多,维护起来特别麻烦。
*/
public class MyDemo {
public static void main(String[] args) {
MyDao target = new MyDao();
MyProxyDao myProxyDao = new MyProxyDao(target);
myProxyDao.save("zhangqi");
}
}
2.动态代理_JDK代理/接口代理
public interface IUserDao {
void save();
}
public class UserDao implements IUserDao {
@Override
public void save() {
System.out.println("保存文件");
}
}
public class ProxyFactory {
IUserDao iUserDao = new UserDao();
public IUserDao getProxyInstance(){
// 创建目标对象的代理对象
return(IUserDao) Proxy.newProxyInstance(iUserDao.getClass().getClassLoader(), iUserDao.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("save")){
System.out.println("先交10块钱,在保存文件");
method.invoke(iUserDao,args);
}
return null;
}
});
}
}
**
* 动态代理:
* 代理对象不需要实现接口,被代理对象需要实现接口
* 也叫做JDK代理或者接口代理 Proxy.newProxyInstance(ClassLoader,Class<?>[] interface,InvocationHandler)
* ClassLoader:目标对象类的加载器
* Class<?>[] interface:目标对象实现的接口类型
* InvocationHandler:事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入
*/
public class ProxyFactoryDemo {
public static void main(String[] args) {
ProxyFactory proxyFactory = new ProxyFactory();
IUserDao proxyInstance = proxyFactory.getProxyInstance();
proxyInstance.save();
}
}