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("                   小红把做完的作业又检查了一遍,不能做的全对,不然太假了");
        }
    }

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

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

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

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

      

  • 相关阅读:
    互联网行业进入规范和监管时期 大数据行业也不例外
    R语言与显著性检验学习笔记
    R语言与显著性检验学习笔记
    大数据应用向前一步是什么
    大数据应用向前一步是什么
    CAS 4.0 配置开发手冊
    WinCE隐藏显示任务栏,当任务栏隐藏时将其显示,当任务栏显示时将其隐藏(FindWindow,ShowWindow,IsWindowVisible),
    每日算法之二十六:Substring with Concatenation of All Words
    Django网站管理--ModelAdmin
    Android实战简易教程-第四十一枪(显示倒计时的Button-适用于获取验证码)
  • 原文地址:https://www.cnblogs.com/blogxiao/p/8111270.html
Copyright © 2011-2022 走看看