• 代理模式


    1、静态代理

      1.1静态代理的代理类和和被代理的类都要维护一个共同的接口。

    public interface IUserDao {
        void save();
    }

      1.2被代理的类,目标对象

    public class UserDao implements IUserDao{
        @Override
        public void save() {
            System.out.println("-----已经保存数据!!!------");
        }
    }

      1.3代理对象

    public class UserDaoProxy implements IUserDao{
        // 接收保存目标对象
        private IUserDao target;
        public UserDaoProxy(IUserDao target) {
            this.target = target;
        }
        @Override
        public void save() {
            System.out.println("开始事务...");
            target.save();             // 执行目标对象的方法
            System.out.println("提交事务...");
        }
    }

      1.4测试类

    public class App {
        public static void main(String[] args) {
            // 目标对象
            IUserDao target = new UserDao();
            // 代理
            IUserDao proxy = new UserDaoProxy(target);
            proxy.save();  // 执行的是,代理的方法
        }
    }

    2、动态代理

      2.1同样的,动态代理也需要完成一个接口。(同上)

      2.2目标对象也是相同的。

      2.3只是在代理对象上有所不同

    public class ProxyFactory {
        // 维护一个目标对象
        private Object target;
        public ProxyFactory(Object target){
            this.target = target;
        }
        // 给目标对象,生成代理对象  
        public Object getProxyInstance() {
            return Proxy.newProxyInstance(
                    target.getClass().getClassLoader(), 
                    target.getClass().getInterfaces(),
                    new InvocationHandler() {
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args)
                                throws Throwable {
                            System.out.println("开启事务");
                            // 执行目标对象方法
                            Object returnValue = method.invoke(target, args);    
                            System.out.println("提交事务");
                            return returnValue;
                        }
                    });
        }
    }

      2.4测试类

    public class App {
        public static void main(String[] args) {
            // 目标对象
            IUserDao target = new UserDao();
            System.out.println(target.getClass());
            // 给目标对象,创建代理对象
            IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
            System.out.println(proxy.getClass());
            // 执行方法   【代理对象】
            proxy.save();
        }
    }

    3、cglib代理

      3.1cglib代理不需要完成接口,只需要写被代理的类和代理类即可,此处被代理类同1.2,所以不再编写。

      3.2代理类有所不同,用到cglib代理模式需要引用spring的核心框架包。

    public class ProxyFactory implements MethodInterceptor{
        // 维护目标对象
        private Object target;
        public ProxyFactory(Object target){
            this.target = target;
        }
        // 给目标对象创建代理对象
        public Object getProxyInstance(){
            //1. 工具类
            Enhancer en = new Enhancer();
            //2. 设置父类
            en.setSuperclass(target.getClass());
            //3. 设置回调函数
            en.setCallback(this);
            //4. 创建子类(代理对象)
            return en.create();
        }
        @Override
        public Object intercept(Object obj, Method method, Object[] args,
                MethodProxy proxy) throws Throwable {
            System.out.println("开始事务.....");
            // 执行目标对象的方法
            Object returnValue = method.invoke(target, args);
            System.out.println("提交事务.....");
            return returnValue;
        }
    }

      3.3测试类

    public class App {
        public static void main(String[] args) {
            // 目标对象
            UserDao target = new UserDao();
            System.out.println(target.getClass());
            // 代理对象
            UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance();
            System.out.println(proxy.getClass());
            // 执行代理对象的方法
            proxy.save();
        }
    }
  • 相关阅读:
    ZOJ 2587 Unique Attack (最小割唯一性)
    POJ 2987 Firing (最大权闭合图)
    POJ 2987 Firing (最大权闭合图)
    POJ 3469 Dual Core CPU (最小割建模)
    POJ 3469 Dual Core CPU (最小割建模)
    UVA 11426 GCD-Extreme(II) ★ (欧拉函数)
    UVA 11426 GCD-Extreme(II) ★ (欧拉函数)
    HDU 4612 Warm up (边双连通分量+DP最长链)
    HDU 4612 Warm up (边双连通分量+DP最长链)
    hdu5531 Rebuild
  • 原文地址:https://www.cnblogs.com/imzhuo/p/5884172.html
Copyright © 2020-2023  润新知