Java回调
最近在看Spring的JdbcTemplate,有碰到很多的回调场景,在这里做一个笔记。
示例:
公司的经理出差时打电话给你让你帮他处理件事情,但不能一直通着电话,于是他让你办好事情后打电话告诉他一声。
现在用代码的方式来实现一个这个过程,看一下这个过程究竟是怎样的。
新建一个Java项目:CallBackDemoInJava;
然后再新建三个类:Manager(该类用来模拟总经理)、Personnel(该类用来模拟员工)、Main(主类);

Manager:
public class Manager {    
    /**  
     * @param personnel  
     *            传入一个员工类的对象  
     */    
    public Manager(Personnel personnel) {    
        // 想让该让员工做什么    
        personnel.doSomething(this, "整理公司文件");    
    }    
    /**  
     * @description 当员工做完总经理让他做的事后就通过该方法通知总经理  
     * @param result  
     *            事情结果  
     */    
    public void phoneCall(String result) {    
        System.out.println("事情" + result);    
    }    
}   
Manager类是个模拟总经理的类,当该类的对象被造出来后就会通过Personnel的对象去执行Personnel中的doSomething方法告诉员工做些什么
Personnel(员工):
public class Personnel {    
    public void doSomething(Manager manager, String task) {    
        // 总经理通过doSomething方法告诉员工要做什么    
        System.out.println("总经理要你做" + task);    
        String result = "做完了";    
        // 当事情做完了我们就通过总经理公布的phoneCall方法通知总经理结果    
        manager.phoneCall(result);    
    }    
}    
总经理通过调用Personnel中的doSomething方法告诉员工该做些什么,当员工做完后就通过Manager中的phoneCall方法通知总经理结果
我们在Main中测试运行下代码看看结果:
public class Main {    
    public static void main(String[] args) {    
        // 首先我们需要一个员工    
        Personnel personnel = new Personnel();    
        // 其次把这个员工指派给总经理    
        new Manager(personnel);    
    }    
}  
代码执行结果如下:

回到我们刚才举的那个现实中的例子:总经理出差前要你去办件事情,这件事情通过doSomething告诉你了,事情要是办完了就打总经理的电话phoneCall通知他一声。这里的phoneCall我们就称为回调方法,数据的流向大致是Manager—–>Personnel—–>Manager,这不就是一个“回调”的过程么?
现在总结下满足回调的两个基本条件:
1.Class A调用Class B中的X方法
2.ClassB中X方法执行的过程中调用Class A中的Y方法完成回调
一切看上去都很完美~以上例子代码简单通俗地描述了回调,但是这里我就会有这样一个疑问:假设总经理出差前交了件事情给我去办,不巧……副总经理也要给我件事去办,更无耻的是……主管也发任务过来了,都要求说做完就打电话通知他们……这时我们就要定义更多类,什么总经理类啦~经理类啦~主管类啦~杂七杂八的类,但是这些杂七杂八的大爷们都要求做完事情就电话通知,每个类都会有一个类似phoneCall的方法作为回调方法,这时,我们利用面向对象的思想来看~是不是可以把这个回调方法抽象出来作为一个独立的抽象类或接口呢?多态的思想油然而生~~~鉴于JAVA接口的好处,我们就定义一个名为CallBack的接口作为回调接口,再在该接口下定义一个名为backResult的抽象方法作为回调方法,让那些总经理类啦~经理类啦~主管类啦~什么的都去实现该接口,这时候我们就来改造下我们的项目:

CallBack代码如下:
/**  
 * @description 该类用来模拟总经理  
*/  
public class Manager implements CallBack {    
    /**  
     * @param personnel  
     *            传入一个员工类的对象  
     */    
    public Manager(Personnel personnel) {    
        // 想让该让员工做什么    
        personnel.doSomething(this, "整理公司文件");    
    }    
    /**  
     * @description 当员工做完总经理让他做的事后就通过该方法通知总经理  
     * @param result  
     *            事情结果  
     */    
    public void backResult(String result) {    
        System.out.println("事情" + result);    
    }    
}    
Personnel代码改造后如下:
doSomething方法不再传入一个Manager对象而是一个CallBack接口:
/**  
 * @description 该类用来模拟员工  
 */    
public class Personnel {    
    public void doSomething(CallBack callBack, String task) {    
        // 总经理通过doSomething方法告诉员工要做什么    
        System.out.println("总经理要你做" + task);    
        String result = "做完了";    
        // 当事情做完了我们就通过总经理公布的phoneCall方法通知总经理结果    
        callBack.backResult(result);    
    }    
}    
Main代码不变,执行结果也是一样的。
Java回调的更多相关文章
- 【java回调】java两个类之间的回调函数传递
		背景交代:熟悉用js开发的cordovaAPP:对java一窍不通的我,老师让做一个监测用户拍照事件的功能,无奈没有找到现成的库,无奈自己动手开发java插件~~0基础java GreenHand,祝 ... 
- Java回调实现
		一.回调的形式 1. C.C++和Pascal允许将函数指针作为参数传递给其它函数.JavaScript,Python,和PHP允许简单的将函数名作为参数传递. 2. .NET Framework的语 ... 
- Java 回调函数
		下面使用java回调函数来实现一个测试函数运行时间的工具类: 如果我们要测试一个类的方法的执行时间,通常我们会这样做: public class TestObject { /** * 一个用来被测试的 ... 
- Java回调理解 (step by step)
		在网上搜索了很多篇关于java回调函数的文章,自己也来试了一下写了这篇博客,可能有些地方理解不到位,烦请各位大大指正. 在计算机程序设计中.回调函数.或简称回调.是指通过函数參数传递到其他代码的,某一 ... 
- java回调机制及其实现(转)
		1. 什么是回调函数 回调函数,顾名思义,用于回调的函数.回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数.回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机.回调 ... 
- java回调函数,看完就懂
		java回调函数在网上了看了些例子,比较绕,不够清晰,自己写的一个例子比较通俗,java回调其实很简单. 举个例子我是类B,我有个方法叫b(),现在我要调用类A中的方法a(),写个代码就是: publ ... 
- Java回调机制总结
		调用和回调机制 在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种: 1.同步调用 同步调用是最基本并且最简单的一种调用方式, 类A的方法a()调用类B的方法b( ... 
- Java回调函数的理解与实现
		回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 在Java里面,我们使用接口来实现回调.举个例子 所谓的回调,就是程序员 ... 
- 转:一个经典例子让你彻彻底底理解java回调机制
		一个经典例子让你彻彻底底理解java回调机制 转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273 ... 
- Java回调实现异步 (转)
		出处: Java回调实现异步 在正常的业务中使用同步线程,如果服务器每处理一个请求,就创建一个线程的话,会对服务器的资源造成浪费.因为这些线程可能会浪费时间在等待网络传输,等待数据库连接等其他事情上, ... 
随机推荐
- 手写一个python迭代器
			分析 我们都知道一个可迭代对象可以通过iter()可以返回一个迭代器. 如果想要一个对象称为可迭代对象,即可以使用for,那么必须实现__iter __()方法. 在一个类的实例对象想要变成迭代器,就 ... 
- Codeforces 1203F2. Complete the Projects (hard version)
			传送门 首先对于 $b>0$ 的工作显然有个贪心,把 $b>0$ 的按 $a$ 从小到大排序 把能做的都做了,然后得到一个最大等级 剩下就是考虑 $b<0$ 的工作了,看到数据显然可 ... 
- 福建工程学院第十四届ACM校赛G题题解
			外传:编剧说了不玩游戏不行 题意: 有n个石堆,我每次只能从某一堆中取偶数个石子,你取奇数个,我先手,先不能操作的人输.问最后谁能赢. 思路: 这个题仔细想想,就发现,取奇数的人有巨大的优势,因为假设 ... 
- redis 学习(11)-- redis pipeline
			redis pipeline 什么是流水线(pipeline) 首先来看 redis 执行一次操作所需要的时间: 1 次时间 = 1 次网络时间 + 1次命令时间 执行 n 次就需要: n 次时间 = ... 
- 分布式的几件小事(四)dubbo负载均衡策略和集群容错策略
			1.dubbo负载均衡策略 ①random loadbalance 策略 默认情况下,dubbo是random loadbalance 随机调用实现负载均衡,可以对provider不同实例设置不同的权 ... 
- 06 Django之模型层---多表操作
			一 创建模型 表和表之间的关系 一对一.多对一.多对多 ,用book表和publish表自己来想想关系,想想里面的操作,加外键约束和不加外键约束的区别,一对一的外键约束是在一对多的约束上加上唯一约束. ... 
- calc,support,media各自的含义及用法
			@support:用于检测浏览器是否支持CSS某个属性,即条件判断,如果支持某个属性,可以写一套样式,如果不支持某属性,提供另一套样式作为替补. calc():用于计算动态函数值,支持“+”,“-”, ... 
- 关于python3.8的一些新特性的解析与代码演示
			python3.8测试版出来了,我们来介绍一些变动,代码演示一下,当然底层相关的细节变动就不介绍了 只允许传位置参数 还记得如果我们想让某些参数只能以关键字参数的方式传递该怎么做吗? def foo1 ... 
- linux内核配置与编译
			配置内核:配置硬件和软件需的部分. make config:基于文本模式的交互式配置.(一问一答) make menuconfig:基于文本模式菜单性配置.(直观简单高效) <*>会产生b ... 
- 防sql注入方法
			mysql_escape_string(strip_tags($arr)) /** * 函数名称:post_check() * 函数作用:对提交的编辑内容进行处理 * 参 数:$post: 要提交的内 ... 
