Java_代理

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();
    }
}




猜你喜欢

转载自blog.csdn.net/dashingqi/article/details/81018585