通过案例来解释回调机制:
案例1:
老师在黑板上谢了一个例子“1+1=”,由小明同学来填空。
由于已经学了10以内的加法,小明同学可完全自己计算:
package ss;
public class Student {
private String name=null;
public Student(String name){
this.name=name;
}
public void setName(String name){
this.name=name;
}
//小明学会的10以内的加法运算
public int caleADD(int a,int b){
if(a<10&&b<10){
return a+b;
}
else{
return 0;
}
}
//自己会的10以内的加法方法
public void fillBack(int a,int b){
int result=caleADD(a, b);
if(result==0){
System.out.println("大于10的不会!!");
}else{
System.out.println(name+"心算"+a+"+"+b+"="+result);
}
}
}
小明同学在填空(fillBalnk)的时候,直接心算(clacADD)了一下,得出结果是2,并将结果写在空格里。测试代码如下:
package ss;
public class Test {
public static void main(String[] args) {
int a=1;
int b=2;
Student student=new Student("小明");
student.fillBack(a, b);
}
}
案例2:
幼师突发奇想在黑板上写了“168 + 291 = ”让小明完成,然后回办公室了。
为什么所有老师都跟小明过不去啊?明明超纲了好不好!这时候小明同学明显不能再像上面那样靠心算来完成了,正在懵逼的时候,班上的小红同学递过来一个只能计算加法的计算器!!!!而小明同学恰好知道怎么用计算器,于是通过计算器计算得到结果并完成了填空。
超级计算器的add方法应该包含两个操作数和小明自身的引用:
package ss;
public class SuperCalculator {
public void add(int a,int b,Student xiaoming){
int result=a+b;
xiaoming.fillBlank(a, b, result);
}
}
小明这边现在已经不需要心算,也不需要使用计算器了,因此只需要有一个方法可以向小红寻求帮助就行了,代码如下:
小明的fillBlank方法就是我们常说的回调函数。
package ss;
public class Student {
private String name=null;
public Student(String name){
this.name=name;
}
public void setName(String name){
this.name=name;
}
//小明学会的10以内的加法运算
public int caleADD(int a,int b){
if(a<10&&b<10){
return a+b;
}
else{
return 0;
}
}
//输出小明学会的10以内的加法运算的结果
public void fillBack(int a,int b){
int result=caleADD(a, b);
if(result==0){
System.out.println("大于10的不会!!");
}else{
System.out.println(name+"心算"+a+"+"+b+"="+result);
}
}
//求助方法
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);
}
}
测试结果:
public class Test
{
public static void main(String[] args)
{
int a = 26549;
int b = 16487;
Student s = new Student("小明");
s.callHelp(a, b);
}
}
案例3:
门口有一个头发花白的老婆婆,每天风雨无阻在那里摆着地摊卖一些快过期的垃圾食品。由于年纪大了,脑子有些糊涂,经常算不清楚自己挣了多少钱。有一天,她无意间听到了小明跟小伙伴们吹嘘自己如何在小红的帮助下与幼师斗智斗勇。于是,婆婆决定找到小红牌超级计算器来做自己的小帮手,并提供一包卫龙辣条作为报酬。小红经不住诱惑,答应了。
小红希望以后继续向班里的小朋友们提供计算服务,同时还能向老婆婆提供算账服务,甚至以后能够拓展其他人的业务,于是她向所有的顾客约定了一个办法,用于统一的处理,也就是自己需要的操作数和做完计算之后应该怎么做。这个统一的方法,小红做成了一个接口,提供给了大家,代码如下:
public interface doJob
{
public void fillBlank(int a, int b, int result);
}
小红修改了自己的计算器,使其可以同时处理不同的实现了doJob接口的人,代码如下:
public class SuperCalculator
{
public void add(int a, int b, doJob customer)
{
int result = a + b;
customer.fillBlank(a, b, result);
}
}
小明和老婆婆拿到这个接口之后,只要实现了这个接口,就相当于按照统一的模式告诉小红得到结果之后的处理办法,按照之前说的使用内部类来做,代码如下:
小明的:
package ss;
public class Student {
private String name=null;
public Student(String name){
this.name=name;
}
public void setName(String name){
this.name=name;
}
public class doHomeWork implements doJob{
@Override
public void fillBack(int a, int b, int result) {
System.out.println(name + "求助小红计算:" + a + " + " + b + " = " + result);
}
}
public void callHelp(int a,int b,int result){
new SuperCalculator().add(a, b, new doHomeWork());
}
}
老婆婆的:
package ss;
public class Seller{
private String name=null;
public Student(String name){
this.name=name;
}
public void setName(String name){
this.name=name;
}
public class doHomeWork implements doJob{
@Override
public void fillBack(int a, int b, int result) {
System.out.println(name + "求助小红计算:" + a + " + " + b + " = " + result);
}
}
public void callHelp(int a,int b,int result){
new SuperCalculator().add(a, b, new doHomeWork());
}
}
测试:
public class Test
{
public static void main(String[] args)
{
int a = 56;
int b = 31;
int c = 26497;
int d = 11256;
Student s1 = new Student("小明");
Seller s2 = new Seller("老婆婆");
s1.callHelp(a, b);
s2.callHelp(c, d);
}
}