Callback机制

2017-02-03  本文已影响71人  perfect_jimmy

模块之间总是存在这一定的接口,从调用方式上看,可以分为三类:同步调用、回调和异步调用
1.同步调用是一种阻塞式调用,也是我们在写程序中经常使用的
2.回调是一种双向的调用模式,也就是说,被调用的接口被调用时也会调用对方的接口
3.异步调用是一种类似消息或事件的机制,解决了同步阻塞的问题
举例来讲:A通知B后,他们各走各的路,互不影响,不用像同步调用那样,A通知B后,非得等到B走完后,A才继续走

Paste_Image.png

同步和异步机制的出现不必多说,大家心知肚明,那回调机制为什么会出现呢?在我们现实生活中,有如下这样场景:有一位老板很忙,他没有时间盯着员工干活,然后他告诉自己的雇员,干完当前这些事情后,告诉他干活的结果。这个例子其实是一个回调+异步的例子,再举一个例子,A程序员写了一段程序a,其中预留了回调函数接口,并封装好了该程序,程序员B让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法,到这里你可能似懂非懂了,后面会继续说明回调的出现原因。接下来我们把上面例子变成代码,看到网上很多人最后搞混了异步和回调,因此例子中不加入异步调用。(注意:回调可不是解决什么调用时间过长问题,那是异步!)

首先创建一个接口:老板需要在员工干完活之后被通知到

public interface CallBackInterface {
    public void solve(String str);
}

创建回调对象:老板,因为员工干完活后要电话老板告诉他活已经干完

/**
 * 老板是作为上层应用身份出现的,下层应用(员工)是不知道 有哪些方法,因此他想被下层应用(员工)调用必须实现此接口 
 */
public class Boss implements CallBackInterface{
    private Employee employee;
    public Boss(Employee employee) {
        this.employee = employee;
    }
    //boss吩咐员工做事
    public void tellToDo(String str){
        System.out.println("boss吩咐员工"+str);
        employee.doThing(this, str);
    }
    //员工做完之后,回调此方法告诉boss事情已近刚做完
    @Override
    public void solve(String str) {
        System.out.println("员工做完之后,回调此方法告诉Boss");
    }
}

创建控制对象:员工,他必须持有老板的地址(回调接口),即使老板换了一茬又一茬,办公室不变,总能找到对应的老板

public class Employee{
    public void doThing(CallBackInterface callBackInterface,String str){
        System.out.println("员工干活:"+str+"干完之后,通知Boss做好了");
        callBackInterface.solve(str);
    }
}

代码测试

public class TestCallBack {
    public static void main(String[] args) {
        Employee employee = new Employee();
        Boss boss = new Boss(employee);
        boss.tellToDo("拖地");
    }
}

执行结果

boss吩咐员工拖地
员工干活:拖地干完之后,通知Boss做好了
员工做完之后,回调此方法告诉Boss
上一篇下一篇

猜你喜欢

热点阅读