Callback的定义
一般在程序中执行回调函数是,是知道回调函数是预留给系统调用的,而且知道该函数的调用时机。
比如说android应用定义一个button对象,并给按钮添加一个监听事件,"onClick"方法就是常用的回调函数,用户触发该事件,android系统会自动调用该函数。
目前最常见的说明就是:
1.class A,class B
2.class A实现接口callback
3.class B拥有一个参数为callback接口类型的函数
4.class A运行时调用class B中的函数,以自身传入参数
5.class B已取得A,就可以随时回调A所实现的callback接口中的方法
写了个例子,BadBoy,这类坏孩子喜欢打人,有个方法叫hit,hit只能对实现了Hitable的对象执行。这时候,BadBoy已经做完了自己的事,也就是已经打完人了,然后挨打的人肯定知道是谁打了自己,至于挨打的人是什么反应,BadBoy是无法控制的。挨打的人有可能哭有可能跑有可能报警。
BadBoy:
1. class BadBoy {
2. String name;
3.
4. public BadBoy(String name) {
5. this.setName(name);
6. }
7.
8. public String getName() {
9. return name;
10. }
11.
12. public void setName(String name) {
13. = name;
14. }
15. //打人
16. public void hit(Hitable hitable) {
17. "----------------BEGIN----------------");
18. "badboy " + this.getName() + "打了"
19. "一拳");
20. this);
21. "-----------------END----------------");
22. }
23.
24. }
挨打的人的接口,他们有一个共同的方法,就是beHit(BadBoy boy),既然挨打了,肯定知道是谁打的自己,所以打人者BadBoy被作为参数传进来。
1. interface Hitable {
2. public void beHit(BadBoy boy);
3.
4. public String getName();
5.
6. public void setName(String name);
7. }
Child:这个类实现了Hitable,小孩挨打了,反应是哭。。
1. class Child implements Hitable {
2. String name;
3.
4. public Child(String name) {
5. this.setName(name);
6. }
7.
8. public String getName() {
9. return name;
10. }
11.
12. public void setName(String name) {
13. = name;
14. }
15.
16. @Override
17. public void beHit(BadBoy boy) {
18. "child " + this.getName() + "被" + boy.getName()
19. "打哭了");
20. }
21.
22. }
BigMan也实现了Hitable接口,这类人比较猛,挨打后的反应,是把打人者杀了。。
1. class BigMan implements Hitable {
2. String name;
3.
4. public BigMan(String name) {
5. this.setName(name);
6. }
7.
8. public String getName() {
9. return name;
10. }
11.
12. public void setName(String name) {
13. = name;
14. }
15.
16. @Override
17. public void beHit(BadBoy boy) {
18. "bigman " + this.getName() + "把" + boy.getName()
19. "杀死了");
20. }
21.
22. }
test类:
1. public class CallBackTest {
2. public static void main(String[] args) {
3. new BadBoy("Tom");
4. new Child("Cat");
5. new BigMan("Boris");
6. badboy.hit(child);
7. badboy.hit(bigman);
8. }
9. }
执行结果:
1. ----------------BEGIN----------------
2. badboy Tom打了Cat一拳
3. child Cat被Tom打哭了
4. -----------------END----------------
5. ----------------BEGIN----------------
6. badboy Tom打了Boris一拳
7. bigman Boris把Tom杀死了
8. -----------------END----------------
这个例子可以看出,坏孩子在打了挨打者以后,把自己作为参数给了挨打者,等于是告诉挨打者,“我打了你,你爱怎么着怎么着吧”,接下来挨打者调用方法beHit,不同类型的挨打者会对坏孩子做出不同的反应。
这个例子类似一个通知,在做取值传值的时候会很有用。
例子2:
根据上边例子再联想一个例子,A取数据要给B,A是一个不断在polling数据的对象,B是一个接口,A取到数据后调用B接口的b方法,并且把自己的引用传给B,告诉B,我已经取到了你要的数据,你自己来拿吧,到这里,A已经完成了任务。B的实现类会根据自己的不同实现,在从A取来数据后进行处理,可能是排序,可能是输出到文件,也可能是打印。
例子2,证明了callback的另一个说法的概念:if you call me,I will call you back。