Java 回调函数

Java 回调函数

基本介绍

  1. 回调函数:回调函数是功能片段,由用户按照回调函数调用约定来实现的一个函数。是工作流的一部分,由工作流来决定函数的调用(回调)时机。
  2. 回调机制:是一种常见的设计模型,他把工作流内的某个功能,按照约定的接口暴露给外部使用者,为外部使用者提供数据,或要求外部使用者提供数据。
  3. 回调的思想:实现双向调用,类A的a方法调用类B的b方法,类B的b方法执行完毕主动调用类A的callback()。?关键是:回调方将本身即this传递给调用方
  4. 回调实现了类与类之间的通信。

举个例子

双向调用

模拟人排队吃饭,阿姨决定通知人是否开饭。
1⃣️ 在接口定义回调函数openRice

public interface IEat {
    void openRice(String msg);
}

2⃣️ People类实现接口,并且将自身引用传给Aunt类
?注意:希望接收事件通知的类必须要实现IEat接口,而且要把自己的引用传递给事件的通知者。

public class People implements IEat {
    private Aunt aunt;

    public void start() {
        aunt = new Aunt(this); // 2
    }

    @Override
    public void openRice(String msg) {
        // 5
        System.out.println(msg);
    }
}

3⃣️ Aunt类调用传过来的引用
?此处的Aunt类作为通知方,将传过来的引用调用其函数。

public class Aunt {
    private IEat mEat;

    public Aunt(IEat mEat) {
        this.mEat = mEat; // 3
        getRice(); // 3
    }

    public void getRice() {
        // PS:此处可以另开线程防止阻塞
        try {
            System.out.println("排队中");
            Thread.sleep(3000);
            System.out.println("到你啦");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        mEat.openRice("开饭了"); //4
    }
}

4⃣️测试类

public class Main {
    public static void main(String[] args) {
        People people = new People();
        System.out.println("开始排队");
        people.start(); //1
    }
}

输出:

开始排队
排队中
到你啦
开饭了

总体实现的流程为:
6BFC2B9D-B011-4C63-B48C-BE69E5C7D8FF.png

暴露接口

类似于Button的点击事件. 参考https://www.jianshu.com/p/67190bdce647

一个打印机,还有一个人,打印机具有打印的功能,但是打印需要时间,不能在收到任务的同时给出反馈,需要等待一段时间才能给出反馈。这个人想做的就是打印一份简历,然后知道打印的结果。这里面代码实现了这两种方式。

1⃣️ 定义回调函数

public interface Callback {
    void printFinished(String msg);
}

2⃣️ 定义打印机类

public class Printer {
    public void print(Callback callback, String text) {
        System.out.println("正在打印");
        try {
            Thread.sleep(3000);
        } catch (Exception e) {
        }
        callback.printFinished("打印完成"); //3
    }
}

3⃣️ 定义People类

public class People {
    Printer printer = new Printer();

    /*
     * 同步回调
     */
    public void goToPrintSyn(Callback callback, String text) {
        printer.print(callback, text);
    }

    /*
     * 异步回调
     */
    public void goToPrintASyn(Callback callback, String text) {
        new Thread(new Runnable() {
            public void run() {
                printer.print(callback, text); //2
            }
        }).start();
    }
}

4⃣️ 测试类

public class Main {
    public static void main(String[] args) {
        People people = new People();
        System.out.println("需要打印的内容是 ---> " + "打印一份简历");
        people.goToPrintASyn(new Callback() { //1
            @Override
            public void printFinished(String msg) {
                System.out.println("打印机告诉我的消息是 ---> " + msg); //4
            }
        }, "打印一份简历");
        System.out.println("我在等待 打印机 给我反馈");
    }
}

输出结果:

需要打印的内容是 ---> 打印一份简历
正在打印
我在等待 打印机 给我反馈
打印机告诉我的消息是 ---> 打印完成

总体流程:
6099271F-2AD1-4BDF-BBDE-AF28FD8C5E58.png

实际开发中

实际开发中遇到使用回调的情况
占坑

本文参考

  1. JAVA回调机制(CallBack)详解
  2. Java回调机制解读
  3. Java回调的原理与实现
  4. Java 回调函数作用和使用场景
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值