Java回调机制(CallBack)详解 - Go语言中文社区

Java回调机制(CallBack)详解


点击上方“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
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-31 00:59:38
  • 阅读 ( 387 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢