专栏名称: 程序员之家
程序员第一自媒体,与你探讨码农人生路上遇到的各类泛技术话题,定期为你推荐码农人生思考、感悟以及启迪!
目录
相关文章推荐
程序员的那些事  ·  3·15 ... ·  2 天前  
程序员的那些事  ·  大家有没有发现一个奇特现象:你能在一个公司工 ... ·  3 天前  
51好读  ›  专栏  ›  程序员之家

JAVA回调机制(CallBack)详解

程序员之家  · 公众号  · 程序员  · 2017-04-07 22:03

正文

作者: Bro__超

原文:www.cnblogs.com/heshuchao/p/5376298.html 点击文末阅读原文即可前往


序言


最近学习java,接触到了回调机制(CallBack)。初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义。当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题。但是,对于初学的我来说,缺了一个循序渐进的过程。此处,将我对回调机制的个人理解,按照由浅到深的顺序描述一下,如有不妥之处,望不吝赐教!


开始之前,先想象一个场景:幼稚园的小朋友刚刚学习了10以内的加法


第1章. 故事的缘起


幼师在黑板上写一个式子 “1 + 1 = ”,由小明同学来填空。


由于已经学习了10以内的加法,小明同学可以完全靠自己来计算这个题目,模拟该过程的代码如下:


public class Student

{

private String name = null;


public Student(String name)

{

// TODO Auto-generated constructor stub

this.name = name;

}


public void setName(String name)

{

this.name = name;

}


private int calcADD(int a, int b)

{

return a + b;

}


public void fillBlank(int a, int b)

{

int result = calcADD(a, b);

System.out.println(name + "心算:" + a + " + " + b + " = " + result);

}

}


小明同学在填空(fillBalnk)的时候,直接心算(clacADD)了一下,得出结果是2,并将结果写在空格里。测试代码如下:


public class Test

{

public static void main(String[] args)

{

int a = 1;

int b = 1;

Student s = new Student("小明");

s.fillBlank(a, b);

}

}


运行结果如下:


小明心算:1 + 1 = 2


该过程完全由Student类的实例对象单独完成,并未涉及回调机制。


第2章. 幼师的找茬


课间,幼师突发奇想在黑板上写了“168 + 291 = ”让小明完成,然后回办公室了。


花擦!为什么所有老师都跟小明过不去啊?明明超纲了好不好!这时候小明同学明显不能再像上面那样靠心算来完成了,正在懵逼的时候,班上的小红同学递过来一个只能计算加法的计算器(奸商啊)!!!!而小明同学恰好知道怎么用计算器,于是通过计算器计算得到结果并完成了填空。


计算器的代码为:


public class Calculator

{

public int add(int a, int b)

{

return a + b;

}

}


修改Student类,添加使用计算器的方法:


public class Student

{

private String name = null;


public Student(String name)

{

// TODO Auto-generated constructor stub

this.name = name;

}


public void setName(String name)

{

this.name = name;

}


@SuppressWarnings("unused")

private int calcADD(int a, int b)

{

return a + b;

}


private int useCalculator(int a, int b)

{

return new Calculator().add(a, b);

}


public void fillBlank(int a, int b)

{

int result = useCalculator(a, b);

System.out.println(name + "使用计算器:" + a + " + " + b + " = " + result);

}

}


测试代码如下:


public class Test

{

public static void main(String[] args)

{

int a = 168;

int b = 291;

Student s = new Student("小明");

s.fillBlank(a, b);

}

}


运行结果如下:


小明使用计算器:168 + 291 = 459


该过程中仍未涉及到回调机制,但是部分小明的部分工作已经实现了转移,由计算器来协助实现。


3. 幼师回来了


发现小明完成了3位数的加法,老师觉得小明很聪明,是个可塑之才。于是又在黑板上写下了“26549 + 16487 = ”,让小明上课之前完成填空,然后又回办公室了。


小明看着教室外面撒欢儿的小伙伴,不禁悲从中来。再不出去玩,这个课间就要废了啊!!!! 看着小红再一次递上来的计算器,小明心生一计:让小红代劳。


小明告诉小红题目是“26549 + 16487 = ”,然后指出填写结果的具体位置,然后就出去快乐的玩耍了。


这里,不把小红单独实现出来,而是把这个只能算加法的计算器和小红看成一个整体,一个会算结果还会填空的超级计算器。这个超级计算器需要传的参数是两个加数和要填空的位置,而这些内容需要小明提前告知,也就是小明要把自己的一部分方法暴漏给小红,最简单的方法就是把自己的引用和两个加数一块告诉小红。


因此,超级计算器的add方法应该包含两个操作数和小明自身的引用,代码如下:

public class SuperCalculator

{

public void add(int a, int b, Student  xiaoming)

{

int result = a + b;

xiaoming.fillBlank(a, b, result);

}

}


小明这边现在已经不需要心算,也不需要使用计算器了,因此只需要有一个方法可以向小红寻求帮助就行了,代码如下:


public class Student

{

private String name = null;


public Student(String name)

{

// TODO Auto-generated constructor stub

this.name = name;

}


public void setName(String name)

{

this.name = name;

}


public void callHelp (int a, int b)

{

new SuperCalculator().add(a, b, this);

}


public void fillBlank(int a, int b, int result)

{

System.out.println(name + "求助小红计算:" + a + " + " + b + " = " + result);







请到「今天看啥」查看全文