社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
点击上方“Java团长”,选择“置顶公众号”
技术干货第一时间送达!
序言
Java回调机制(CallBack),初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义。当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题。但是,对于初学的我来说,缺了一个循序渐进的过程。此处,将我对回调机制的个人理解,按照由浅到深的顺序描述一下,如有不妥之处,望不吝赐教!
开始之前,先想象一个场景:幼稚园的小朋友刚刚学习了10以内的加法。
第1章. 故事的缘起
幼师在黑板上写一个式子 “1 + 1 = ”,由小明同学来填空。
由于已经学习了10以内的加法,小明同学可以完全靠自己来计算这个题目,模拟该过程的代码如下:
1 public class Student
2 {
3 private String name = null;
4
5 public Student(String name)
6 {
7 // TODO Auto-generated constructor stub
8 this.name = name;
9 }
10
11 public void setName(String name)
12 {
13 this.name = name;
14 }
15
16 private int calcADD(int a, int b)
17 {
18 return a + b;
19 }
20
21 public void fillBlank(int a, int b)
22 {
23 int result = calcADD(a, b);
24 System.out.println(name + "心算:" + a + " + " + b + " = " + result);
25 }
26 }
小明同学在填空(fillBalnk)的时候,直接心算(clacADD)了一下,得出结果是2,并将结果写在空格里。测试代码如下:
1 public class Test
2 {
3 public static void main(String[] args)
4 {
5 int a = 1;
6 int b = 1;
7 Student s = new Student("小明");
8 s.fillBlank(a, b);
9 }
10 }
运行结果如下:
小明心算:1 + 1 = 2
该过程完全由Student类的实例对象单独完成,并未涉及回调机制。
第2章. 幼师的找茬
课间,幼师突发奇想在黑板上写了“168 + 291 = ”让小明完成,然后回办公室了。
花擦!为什么所有老师都跟小明过不去啊?明明超纲了好不好!这时候小明同学明显不能再像上面那样靠心算来完成了,正在懵逼的时候,班上的小红同学递过来一个只能计算加法的计算器(奸商啊)!!!!而小明同学恰好知道怎么用计算器,于是通过计算器计算得到结果并完成了填空。
计算器的代码为:
1 public class Calculator
2 {
3 public int add(int a, int b)
4 {
5 return a + b;
6 }
7 }
修改Student类,添加使用计算器的方法:
1 public class Student
2 {
3 private String name = null;
4
5 public Student(String name)
6 {
7 // TODO Auto-generated constructor stub
8 this.name = name;
9 }
10
11 public void setName(String name)
12 {
13 this.name = name;
14 }
15
16 @SuppressWarnings("unused")
17 private int calcADD(int a, int b)
18 {
19 return a + b;
20 }
21
22 private int useCalculator(int a, int b)
23 {
24 return new Calculator().add(a, b);
25 }
26
27 public void fillBlank(int a, int b)
28 {
29 int result = useCalculator(a, b);
30 System.out.println(name + "使用计算器:" + a + " + " + b + " = " + result);
31 }
32 }
测试代码如下:
1 public class Test
2 {
3 public static void main(String[] args)
4 {
5 int a = 168;
6 int b = 291;
7 Student s = new Student("小明");
8 s.fillBlank(a, b);
9 }
10 }
运行结果如下:
小明使用计算器:168 + 291 = 459
该过程中仍未涉及到回调机制,但是部分小明的部分工作已经实现了转移,由计算器来协助实现。
3. 幼师回来了
发现小明完成了3位数的加法,老师觉得小明很聪明,是个可塑之才。于是又在黑板上写下了“26549 + 16487 = ”,让小明上课之前完成填空,然后又回办公室了。
小明看着教室外面撒欢儿的小伙伴,不禁悲从中来。再不出去玩,这个课间就要废了啊!!!! 看着小红再一次递上来的计算器,小明心生一计:让小红代劳。
小明告诉小红题目是“26549 + 16487 = ”,然后指出填写结果的具体位置,然后就出去快乐的玩耍了。
这里,不把小红单独实现出来,而是把这个只能算加法的计算器和小红看成一个整体,一个会算结果还会填空的超级计算器。这个超级计算器需要传的参数是两个加数和要填空的位置,而这些内容需要小明提前告知,也就是小明要把自己的一部分方法暴漏给小红,最简单的方法就是把自己的引用和两个加数一块告诉小红。
因此,超级计算器的add方法应该包含两个操作数和小明自身的引用,代码如下:
1 public class SuperCalculator
2 {
3 public void add(int a, int b, Student xiaoming)
4 {
5 int result = a + b;
6 xiaoming.fillBlank(a, b, result);
7 }
8 }
小明这边现在已经不需要心算,也不需要使用计算器了,因此只需要有一个方法可以向小红寻求帮助就行了,代码如下:
1 public class Student
2 {
3 private String name = null;
4
5 public Student(String name)
6 {
7 // TODO Auto-generated constructor stub
8 this.name = name;
9 }
10
11 public void setName(String name)
12 {
13 this.name = name;
14 }
15
16 public void callHelp (int a, int b)
17 {
18 new SuperCalculator().add(a, b, this);
19 }
20
21 public void fillBlank(int a, int b, int result)
22 {
23 System.out.println(name + "求助小红计算:" + a + " + " + b + " = " + result);
24 }
25 }
测试代码如下:
1 public class Test
2 {
3 public
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/FYGu18/article/details/79694718
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!