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

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

建议:

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

案例要求:

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

期间岳老板忙自己的事,

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

代码实现:

回调接口
/** * 回调函数接口 */ 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(); } }
运行结果:

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

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

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

技术
©2019-2020 Toolsou All rights reserved,
Vue.js入门(五)---在vue中使用echarts词云Pandas统计分析基础_数据处理(DataFrame常用操作)element UI dialog点击dialog区域外会关闭dialog应届毕业生看过来!Java面试经典77问,看完离工作就不远了关于蓝桥杯大赛,你应该了解的那些事!mysql 分区-key分区(五)海康威视-嵌入式软件笔试题PHP Redis 监听过期的 key 事件C语言循环语句笔记详解以及练习-折半查找算法、猜数字游戏JVM概述