接口回调的设计在实际应用中很多,其概念单从文字角度比较难以理解

那么下面就一个简单的实际应用案例理解

建议:

跟着动手敲一敲,画调用关系图,然后看注释反复理解

案例要求:

岳老板命令出去司机去修车,

期间岳老板忙自己的事,

司机修车完成后给岳老板报告;

代码实现:

回调接口

/**
 * 回调函数接口
 */
public interface CallBack {
    /**
     * 报告方法,
     * 这就是回调方法
     * 当司机修完车会主动调用这个方法,给老板报告
     * 为什么是回调?
     * 老板继承CallBack接口
     * 这个report()方法属于老板
     * 老板命令司机做事,调用司机的修车方法,司机做完事会反过来调用老板的方法进行报告,老板反过来被调用的方法就是“回调方法”
     * 这就是回调
     * 你给别人发短信,别人收到短信通过你的手机号给你回复,你的手机号就是回调方法,收发需要通过手机号
     * @param str
     */
    public void report(String str);
}

老板类

/**
 * 老板类
 * 老板只有继承了回调接口,才可以使用回调的方法
 */
public class Boss implements CallBack {
    /**
     *  private Driver driver;这个理解为:
     * 你要调用司机的修车方法,你得有司机的对象,不然无法调用
     */
    private Driver driver;
    public Boss(Driver driver){
        this.driver=driver;
    }

    /**
     * 修车方法
     * 老板通过此方法命令司机去修车
     */
    public void orderFix(){
        System.out.println("岳老板嘱咐司机去修车");
        //新建一个线程,调用司机修车方法,
        // 现实理解是:不干扰老板的线程,老板要继续做自己的事情
        new Thread(()->driver.FixCar(this)).start();
    }
    /**
     * 这是回调方法,属于老板
     * 司机修完车会调用这个方法
     * @param str
     */
    @Override
    public void report(String str) {
        System.out.println(str);
    }
    public void doOther(){
        System.out.println("岳老板去做自己的其他事情了。。。。。。。。。。。");
    }
}

司机类

/**
 * 司机类
 */
public class Driver {
    /**
     * 司机修车方法
     * 回调接口作为参数
     * 目的是为了调用回调方法,给老板报告
     * @param callBack
     */
    public void FixCar(CallBack callBack){
        try {
            //线程休眠,模拟修车过程
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //修车完成后,调用回调方法,通知老板车修好了
        callBack.report("司机报告:老板,车给你修好了,我先溜了溜了");
    }
}

测试类

/**
 * 测试类
 */
public class TestDemo {


    public static void main(String[] args) {
        Driver driver=new Driver();
        Boss yue=new Boss(driver);
        //命令司机去修车,修好了给老板报告
        yue.orderFix();
        //老板忙自己的事情
        yue.doOther();
    }
}

运行结果:

岳老板嘱咐司机去修车
岳老板去做自己的其他事情了。。。。。。。。。。。

(司机修车的过程。。。。。)

司机报告:老板,车给你修好了,我先溜了溜了