我问你问我问你的答案——回调

来源:互联网 发布:mac显卡驱动升级 编辑:程序博客网 时间:2024/04/27 14:27

这几天朋友在找工作,打电话问了我一些面试意见和可能会问到的问题,其中说到,回调,他虽然也在用,也看了不少解释,就是不知道到底要怎么去解释这个回调。

所以今天,我也谈谈回调,给一个最简洁的小例子。


其实,个人理解的回调就是,
1.需要有两个类(调用者与被调用者,只是这两个类的调用关系比较暧昧)
2.A调用B,让B去完成某个任务
3.但B如果要完成这个任务,需要调用A的一个方法协作(这个方法,就是回调方法)
4.B成功调用了A的方法协作,B最终顺利完成了任务


本例的情景是这样的:A问B:某个数的10次方是多少?B开始作答,但是他要先问A:这个数是多少?A说:是10B给出了答案

下面来看代码:
主角有三:
1.接口CallBack类(回调方法)
2.A类(任务的发起者)
3.B类(任务的执行者)


1.首先是接口CallBack:

public interface CallBack {    // 回调方法,本例的主角    float doCallBack();}

2.其次是任务发起者A类:

public class A implements CallBack {    //A中的方法,参数是B类,该方法中调用B的方法    public void AaskB(B class_b) {        System.out.println("A开始问B问题: 某个数的10次方是多少?");        //调用B的方法        class_b.BanswerA(this);    }    //回调方法,这里抽出来写,也可以直接把上面的参数this改为直接new CallBack()直接写    @Override    public float doCallBack() {        System.out.println("(A中的回调方法),A说,这个数是 2");        return 2;    }}

3.最后是任务执行者B类:

public class B {    // B中唯一的方法,被A调用了,这个方法的参数是A中的 回调函数    public void BanswerA(CallBack callback) {        System.out.println("B接收到A问的问题,但是B不知道这个数是什么,他调用A中的回调方法去问这个数");        // 调用类A中的回调方法        // 然后回答         // (这里两步并作一步写)        System.out.println("B接收到A说的数,给出了答案" + Math.pow(callback.doCallBack(), 10));    }}

好了,大功告成:
让我们来写个测试类Test试试:

public class Test {    public static void main(String[] args) {        A classA = new A();        B classB = new B();        classA.AaskB(classB);    }}

控制台的输出结果:

A开始问B问题: 某个数的10次方是多少?B接收到A问的问题,但是B不知道这个数是什么,他调用A中的回调方法去问这个数(A中的回调方法),A说,这个数是 2B接收到A说的数,给出了答案1024.0

如果还觉得不够直观。
那我们可以把他们稍作改造,全部简写在一个类中

//A类public class A {    //接口    public interface CallBack {        void doCallBack();    }    //A中的方法,调用B    public void AaskB(B class_b) {        class_b.BanswerA(new CallBack() {            @Override            public void doCallBack() {                System.out.println("(A中的回调方法),A问B -- >B问A");            }        });    }    //B类,就一个方法(参数是接口)    public static class B {        public void BanswerA(CallBack callback) {            callback.doCallBack();        }    }    //测试类    public static class Test {        public static void main(String[] args) {            A classA = new A();            B classB = new B();            classA.AaskB(classB);        }    }}

执行,控制台输出:

(A中的回调方法),A问B -- >B问A

可以看到,虽然代码大量简写(省略了一些System.out),但是主要的核心思想,”回调”这个步骤还是展现出来了
测试中,A只是执行了问B的方法,控制台输出的 却是A类中的这个回调方法中的执行逻辑。

充分体现了,A问B,B问A,B再执行完毕。这个过程


好了,献上我的源码Demo源码

分成四个类写的: http://download.csdn.net/detail/lebang08/9649587
极简版: http://download.csdn.net/detail/lebang08/9649630

0 0