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

  • 相关阅读:
    记录软件工程课程项目开发时遇到的各种小问题(django)
    用python实现逻辑回归
    利用KD树进行异常检测
    PyQt4入门学习笔记(五)
    PyQt4入门学习笔记(四)
    import matplolib 时出现"This probably means that tk wasn't installed properly."的解决方法
    IDEA上安装和使用checkstyle,findbugs,visualVM,PMD插件
    pycharm连接mysql数据库
    基于trie树做一个ac自动机
    用python实现最长公共子序列算法(找到所有最长公共子串)
  • 原文地址:https://www.cnblogs.com/ffeiyang/p/9412233.html
Copyright © 2011-2022 走看看