======================================================
注:本文源代码点此下载
======================================================
回调机制
软件模块之间的调用方式,分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单项调用;回调是一种双向调用的方式,被调用方被调用的同时也会调用对方的接口;异步调用是一种类似消息的机制,不过他的调用方向刚好相反,接口的服务在收到某种消息时,会主动通知客户方。
java回调实现
java是通过定义一个接口,并在该接口中声明我们要调用的方法,来实现回调。
具体的实现通过一个汽车的例子来展现。
我们首先定义一个汽车的接口:
package com.huawei.callback;
public interface car {
public abstract void run();
public abstract void stop();
public abstract void restart();
public abstract void refuel();
public abstract void refit(string reason);
}
其中定义了作为一个汽车可以有的几个操作,但是都没有实现,需要子类去实现。
然后我们定义一个宝马汽车类,实现car接口
package com.huawei.callback;
public class bmw implements car {
@override
public void run() {
// todo auto-generated method stub
system.out.println("bmw is runing");
}
@override
public void refit(string reason) {
// todo auto-generated method stub
system.out.println("bmw is refiting because "+reason);
}
@override
public void refuel() {
// todo auto-generated method stub
system.out.println("bmw is refueling");
}
@override
public void restart() {
// todo auto-generated method stub
system.out.println("bmw is restarting");
}
@override
public void stop() {
// todo auto-generated method stub
system.out.println("bmw is stoping");
}
}
最后我们写一个测试类
package com.huawei.callback;
public class test {
public static void simulate(car c){
c.run();
c.stop();
c.restart();
c.refuel();
c.refit("test");
}
public static void main(string[] args){
bmw bmw = new bmw();
simulate(bmw);
}
}
输出
bmw is runing
bmw is stoping
bmw is restarting
bmw is refueling
bmw is refiting because test
回调主要是用在声明和实现分离的情况下(car和bmw分离),比如设计类库的人和用类库的人,设计类库的人不用管具体的功能是怎么实现的,他只需要回调对方的实现即可,具体怎么实现由用类库的人来做。
比较经典的例子还有排序时的比较函数,用户可以自行设计比较函数,排序算法回调用户的比较函数进行排序
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/