最近在看Spring的JdbcTemplate,有碰到不少的回调场景,在这里作一个笔记。java
示例:ide
公司的经理出差时打电话给你让你帮他处理件事情,但不能一直通着电话,因而他让你办好事情后打电话告诉他一声。测试
如今用代码的方式来实现一个这个过程,看一下这个过程到底是怎样的。this
新建一个Java项目:CallBackDemoInJava;spa
而后再新建三个类:Manager(该类用来模拟总经理)、Personnel(该类用来模拟员工)、Main(主类);.net
Manager:code
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(员工):blog
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代码不变,执行结果也是同样的。