回调

来源:互联网 发布:网络运维管理制度 编辑:程序博客网 时间:2024/05/16 09:58

摘自于百度:

软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。同步调用是三者当中最简单的,而回调又常常是异步调用的基础。


下面来说个故事:

我昨晚又熬夜写代码了,今天上课想睡觉了,但是我怕老师来了怪我,所以我告诉同桌小黑来了请叫我。这里有两个对象,我和同桌小黑。我具有三个方法,①想睡觉了②开始睡觉③正在睡觉。小黑是个傻X,什么都不会,我定义了一个接口(接口里面有叫醒我的方法),让小黑去实现,然后小黑就具有了叫醒我的方法。

package com.test.sleep;public class Me {public void startSleep() {System.out.println("开始睡觉了");}public void wantTosleep() {System.out.println("想睡觉了");}public void stopsleep() {System.out.println("停止睡觉");}}


这是一个监听器,待会要给我的同桌赋值这个监听器,告诉他怎么叫我醒来,毕竟他是个傻X。怎么黑同学合适吗?

package com.test.sleep;public interface CallSbListener {/** * 叫醒我睡觉的方法 * @param teacherName */void callMeStopSleep(String teacherName);}



这是我的同桌,他有一个监听器。也可以在这里直接实现这个监听器。

package com.test.sleep;public class ClassMate {CallSbListener mCallSbListener;public ClassMate() {super();}public ClassMate(CallSbListener mCallSbListener) {super();this.mCallSbListener = mCallSbListener;}public void callMeStopSleep(String teacherName){mCallSbListener.callMeStopSleep(teacherName);}/** * 赋值listener * @param mCallSbListener */public void setmCallSbListener(CallSbListener mCallSbListener) {this.mCallSbListener = mCallSbListener;}}



下面是测试类:
package com.test.sleep;public class Test {public static void main(String[] args) {final Me me = new Me();me.wantTosleep();System.out.println("找同桌商量");ClassMate classMate = new ClassMate();classMate.setmCallSbListener(new CallSbListener() {@Overridepublic void callMeStopSleep(String teacherName) {System.out.println(teacherName+"来了...");me.stopsleep();}});System.out.println("商量好了...");me.startSleep();// 模拟伍老师来了.try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}classMate.callMeStopSleep("王老师");}}


new出来一个同桌对象,给他设置一个监听器,监听器的方法中实现了叫醒我的方法。

0 0