zoukankan      html  css  js  c++  java
  • 代理、动态代理

    定义接口和目标对象

    /**
     * 参考人员接口
     * 
     * @author Silence
     *
     */
    public interface Candidate {
    
        /**
         * 答题
         */
        public void answerTheQuestions();
    }
    /**
     * 懒学生
     * 
     * @author Silence
     *
     */
    public class LazyStudent implements Candidate {
    
        private String name;
    
        public LazyStudent(String name) {
            super();
            this.name = name;
        }
    
        @Override
        public void answerTheQuestions() {
            // 懒学生只能写出自己的名字不会答题
            System.out.println("姓名:" + name);
        }
    
    }

    静态代理

    /**
     * 静态代理,也要实现接口,不利于代码维护
     * 
     * @author Silence
     *
     */
    public class Gunman implements Candidate {
    
        private Candidate target; // 被代理对象
    
        public Gunman(Candidate target) {
            this.target = target;
        }
    
        @Override
        public void answerTheQuestions() {
            // 枪手要写上代考的学生的姓名
            target.answerTheQuestions();
            // 枪手要帮助懒学生答题并交卷
            System.out.println("奋笔疾书正确答案");
            System.out.println("交卷");
    
        }
    }
    @Test
        public void ProxTest1() {
            Candidate candidate = new Gunman(new LazyStudent("王小二"));
            candidate.answerTheQuestions();
    
        }

    动态代理---不需要实现接口,推荐使用

    public class ProxyFactory {
    
        private Candidate target;
    
        public ProxyFactory(Candidate 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 {
                            // 执行目标对象的方法
                            Object retVal = method.invoke(target, args);
                            System.out.println("奋笔疾书正确答案。。。。。");
                            System.out.println("交卷");
                            return retVal;
                        }
                    });
        }
    }
    @Test
        public void ProxyTest2(){
            // 目标 对象
            Candidate target = new LazyStudent("明明");
            // 原始的类型
            System.out.println(target.getClass());
    
            // 给目标对象创建代理对象
            Candidate proxy = (Candidate) new ProxyFactory(target).getProxyInstance();
            // 内存中动态生成的代理对象
            System.out.println(proxy.getClass());
    
            // 执行方法 【代理对象】
            proxy.answerTheQuestions();
    
        }
    
    }

  • 相关阅读:
    English trip V1
    English trip V1
    第一类斯特林数
    bzoj 3601 一个人的数论
    bzoj 4407 于神之怒加强版
    bzoj 2693 jzptab
    bzoj 4184 shallot
    luogu P3920 [WC2014]紫荆花之恋
    bzoj 4269 再见Xor
    luogu P2183 [国家集训队]礼物
  • 原文地址:https://www.cnblogs.com/ffeiyang/p/9412233.html
Copyright © 2011-2022 走看看