深入理解Java回调函数

来源:互联网 发布:淘宝超级店长使用教程 编辑:程序博客网 时间:2024/05/22 02:13

废话不多说,像许多网上介绍回调机制的文章一样,我这里也以一个现实的例子开头:假设你公司的总经理出差前需要你帮他办件事情,这件事情你需要花些时间去做,这时候总经理肯定不能守着你做完再出差吧,于是就他告诉你他的手机号码叫你如果事情办完了你就打电话告诉他一声;这是一个现实生活中常能碰到的例子,我们用呢就用代码的方式来实现一个这个过程,看一下这个过程究竟是怎样的。

首先在Eclipse中新建一个Java项目:CallBackDemoInJava;

然后再新建三个类:Manager(该类用来模拟总经理)、Personnel(该类用来模拟员工)、Main(主类);


Manager的代码如下:

package com.test;    /**  * @description 该类用来模拟总经理  */  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的代码如下:

package com.test;    /**  * @description 该类用来模拟员工 */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中测试运行下代码看看结果:

package com.test;    public class Main {      public static void main(String[] args) {          // 首先我们需要一个员工          Personnel personnel = new Personnel();            // 其次把这个员工指派给总经理          new Manager(personnel);      }  }  


代码执行结果如下:


回到我们刚才举的那个现实中的例子:总经理出差前要你去办件事情,这件事情通过doSomething告诉你了,事情要是办完了就打总经理的电话phoneCall通知他一声。这里的phoneCall我们就称为回调方法,为什么称之为回调呢?你问我我也不清楚哈~这你得问Sun公司了,不过我们从代码的执行过程可以看出数据的流向大致是Manager—–>Personnel—–>Manager,这不就是一个“回调”的过程么?现在我们来总结下满足回调的两个基本条件:

1.Class A调用Class B中的X方法

2.ClassB中X方法执行的过程中调用Class A中的Y方法完成回调

一切看上去都很完美~以上例子代码简单通俗地描述了回调,但是这里我就会有这样一个疑问:假设总经理出差前交了件事情给我去办,不巧……副总经理也要给我件事去办,更无耻的是……主管也发任务过来了,都要求说做完就打电话通知他们……这时我们就要定义更多类,什么总经理类啦~经理类啦~主管类啦~杂七杂八的类,但是这些杂七杂八的大爷们都要求做完事情就电话通知,每个类都会有一个类似phoneCall的方法作为回调方法,这时,我们利用面向对象的思想来看~是不是可以把这个回调方法抽象出来作为一个独立的抽象类或接口呢?多态的思想油然而生~~~鉴于JAVA接口的好处,我们就定义一个名为CallBack的接口作为回调接口,再在该接口下定义一个名为backResult的抽象方法作为回调方法,让那些总经理类啦~经理类啦~主管类啦~什么的都去实现该接口,这时候我们就来改造下我们的项目:


CallBack代码如下:

package com.test;    /**  * @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接口:

package com.test;    /**  * @description 该类用来模拟员工  */  public class Personnel {      public void doSomething(CallBack callBack, String task) {          // 总经理通过doSomething方法告诉员工要做什么          System.out.println("总经理要你做" + task);            String result = "做完了";            // 当事情做完了我们就通过总经理公布的phoneCall方法通知总经理结果          callBack.backResult(result);      }  }  


Main代码不变,执行结果也是一样的。


3 1
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 最里面的牙黑了怎么办 牙龈的肉裂开了怎么办 有蛀牙怎么办可以变好么 拔智齿没拔干净怎么办 蛀牙只剩牙根了怎么办 牙掉的就剩牙根怎么办 蛀牙牙冠都掉了怎么办 拔智齿断了牙根怎么办 牙肉肿痛有脓包怎么办 种植牙到寿命后怎么办 牙齿松动快掉了怎么办 一颗牙齿松动了怎么办 种植牙牙冠掉了怎么办 牙就剩下牙根了怎么办 后面的大牙掉了怎么办 两边大牙都没了怎么办 拔牙把牙根断了怎么办 拔乳牙牙根断了怎么办 拔牙时牙根断了怎么办 孕晚期牙根掉了怎么办 根管治疗后牙裂怎么办 智齿拔断了牙根怎么办 大牙断了牙根还在怎么办 孕妇牙疼的要命怎么办 牙烂了个大窟窿怎么办 牙齿又痒又痛怎么办 大牙就剩牙根了怎么办 蛀牙只剩牙根痛怎么办 带牙冠的牙疼了怎么办 牙龈肉与牙分离怎么办 后槽牙松动还疼怎么办 嘴唇又干又痒怎么办 嘴唇边突然肿了怎么办 大牙齿蛀牙很疼怎么办 蛀牙经常牙疼怎么办呢 小孩牙齿稀疏牙缝大怎么办 7岁牙齿缝隙大怎么办 小孩牙掉了不长怎么办 牙掉了一年不长怎么办 27岁了牙齿不齐怎么办 整个牙床都在痛怎么办