zoukankan      html  css  js  c++  java
  • java设计模式之代理模式 ,以及和java 回调机制的区别

    1. java 代理模式就是

          将自己要做的事交给别人去做(这个别人就是代理者,自己就是被代理者),为什么自己能做的要交给别人去做了?假如一个小学生小明,现在要写作业,但是又想玩游戏,他更想玩游戏,并且不想被妈妈骂,所有他找了个天才枪手,小红给他代写作业,自己再去把作业交给妈妈检查。小明妈妈看见是小明交的作业,也就没怀疑不是他自己的做的。目的达到了,过程就不那么重要了(当然不是不对的了,这里只是为了讲述设计模式而模拟的某种场景)。  

      

      2.代理模式要点:

         1.一个抽象的主题(这里抽象的主题就是写作业)

         2.一个代理者(小红),继承抽象主题(写作业)

         3.一个被代理者(小明),继承抽象主题(写作业)

         4.一个管理者继承抽象主题,一个被代理者对象(3 和 4 可以任选一个,3 是将被代理者和管理者合并成一个   ,4 是将被代理者 和 管理者分开)

          

       3.代理模式的应用:spring AOP 面相切面编程,例如事物的管理委托给spring 容器去管理,程序员只用关系核心业务层,高度复用的模块交给代理者去做,不用重复的工作。增加系统的代码冗余。

    代码:

    抽象主题

    package javadesign.staticProxy;
    
    /**
     * Created by Administrator on 2017/12/21.
     *
     * 概念:某项任务要交给对象A完成,C又把A 的任务交给了B去做,A就是被代理者,B就是代理者,C 就是委托人
     *
     * 实现:创建一个代理的主题,代理者和被代理者都继承这个类并且,实现主题
     * 为什么代理类和被代理类都要实现这个?现在有个做作业的任务,抽象出来一个做作业的主题。
     *
     * 场景 :一天小明的妈妈让小明做作业,首先小明得接受做作业这个任务,所以他继承做作业这个主题,
     * 但是小明想打游戏,作业还必须得完成,他找到一个瞒天过海的方法,让小红去做作业,但是还要伪装成自己的做的,
     * 所以小红也得继承做作业这个主题
     *
     * 效果:小红 和 小明 都是调用同一个做作业名称,小明妈妈傻傻分不清楚,到底是谁做的作业(真正是小红做的,只是小明妈妈不知道),
     * 这就达到了代理的目的
     *
     */
    public interface ProxyWork {
    
       public void doHomeWork();
    }

    被代理者(or 委托者)

    package javadesign.staticProxy;
    
    import org.junit.Test;
    
    /**
     * Created by Administrator on 2017/12/21.
     * 创建一个代理的管理者,将要代理的任务分配给真正的处理任务的类,就是小明把自己的作业交给小红学霸做啦
     */
    public class ProxyManager implements ProxyWork {
        private ProxyWork proxyWork;
    
        /*
        * 这个方法是设置代理的方法,运用到了java 多态的思想
        * */
        public void setAgency(ProxyWork proxyWork){
            this.proxyWork=proxyWork;  // 这个方法是将真正的代理类(小红)作为参数传递给
        }
    
        @Override
        public void doHomeWork() {
            System.out.println("小明开始假装做作业");
            //其实小明没有做作业,而是叫来小红,让小红去做
            if(this.proxyWork!=null){ //先判断小红的引用是否传递过来
                proxyWork.doHomeWork(); //这里小红开始做作业,实施瞒天过海大计的关键一步
            }
            System.out.println("小明告诉妈妈,作业完成了");
        }
    
    /*
    * 开始测试代理,模拟一个场景
    *
    * */
        @Test
        public void client(){
            ProxyManager proxyManager=new ProxyManager();
            proxyManager.setAgency(new ProxyRealWork());  //new ProxyRealWork 创建一个名叫小红的代理者
            proxyManager.doHomeWork(); //小明开始假装做作业,真正做作业的是小红
        }
    
    
    }

    代理者:

    package javadesign.staticProxy;
    
    /**
     * Created by Administrator on 2017/12/21.
     */
    public class ProxyRealWork implements ProxyWork {
    
        private ProxyWork proxyWork;   //将被代理者,也就是游戏小王子小明传递过来,其实也就是java 的多态
    
        //这里传入被代理者,用到了多态
        public void setAgency(ProxyWork proxyWork){   //这里将会传入实例化的小明
            this.proxyWork=proxyWork;
        }
    
    
        /*
            这个代理者是真正做作业的人,也即是小红这个学霸
         */
        @Override
        public void doHomeWork() {
            this.before();
            //这个位置也就是相当于Spring Aop 切点的位置service 层
             System.out.println("                     真正的任务执行者,正在执行任务,也就是小红做作业啦");
            this.after();
        }
    
        /*
        * 这里的预处理和善后处理类似于Spring的面向切面编程,具体的实现有事务管理,日志等
        * */
    
        //预处理动作
        private void before(){
            //TODO
            System.out.println("                 小红预温习了功课,然后开始做作业");
        }
    
        //善后处理
        private void after(){
            //TODO
            System.out.println("                   小红把做完的作业又检查了一遍,不能做的全对,不然太假了");
        }
    }

    代理模式和回调模式的区别:

      本人认为两者是相同的,都是同一种思想(自己的事情交给别人做,自己发出命令),若更加严格的区分,也是两种思想(一个强调代理,一个强调回调),若要真的找不同,那就从他们具体的实现方式(代理模式:追求主题的统一,发出命令,各谋其事;回调机制:追求通知,发出命令,接受通知)

    注释:本文中的代理模式是静态代理,耦合性很高,在项目中可能很少用,所以项目中要开发通用的代理就要利用反射机制,实现动态代理。(例如 小红 要帮小明,小张,小王三个人写作业,他们的作业本的要分别对应他们三个人,不能只对应某个人)

    注明:本文原创,可以转载,可以评论,有不对的地方欢迎指正,在别的地方看到类似的文章,不喜勿喷,只是自己加深理解写的文章 。

      

  • 相关阅读:
    CNN comprehension
    Gradient Descent
    Various Optimization Algorithms For Training Neural Network
    gerrit workflow
    jenkins job配置脚本化
    Jenkins pipeline jobs隐式传参
    make words counter for image with the help of paddlehub model
    make words counter for image with the help of paddlehub model
    git push and gerrit code review
    image similarity
  • 原文地址:https://www.cnblogs.com/blogxiao/p/8111270.html
Copyright © 2011-2022 走看看