回调函数就是在一个不确定实现方法中用interface或者它的抽象方法留个口子,留给具体调用者调用时补全,从而达到更灵活地编码的目的,也大大减少了子类的使用。
没例子没法讲,下面的例子模拟的是 客户端发送消息到服务器端,通过回调函数返回“状态值”(及服务器端是否收到消息)到客户端。
客户端与服务器端需要约定一个接口,我们先来定义这个接口。
package cn.hpy.com;
/**
* 客户端和服务器约定的接口
* @author hpy1012
*
*/
public interface CSCallback {
/**
*
* @param status //服务器后面可以返回给客户端的值
*/
public void process(String status);
}
客户端:
package cn.hpy.com;
/**
*
* @author hpy1012
*因为服务器端的getClientmsg持有该接口 通过实现该接口,
*/
public class Client implements CSCallback{
//在构造函数这把对应的服务器给客户端
private Server server;
public Client(Server server)
{
this.server=server;
}
public void sendMsg(final String msg)
{
System.out.println("客户端发送的消息为:"+msg);
//这个this 是指实现了的CScallback的当前client对象
server.getClientmsg(this, msg);
}
@Override
public void process(String status) {
// TODO Auto-generated method stub
System.out.println("客户端收到的status是"+status);
}
}
服务器端:
package cn.hpy.com;
public class Server {
/**
*
* @param callback
* @param msg 客户端传递给服务端的消息
*/
public void getClientmsg(CSCallback callback,String msg)
{
System.out.println("服务端收到的消息为: "+msg);
//模拟收到消息后服务器进行的耗时操作
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//status是返回给客户端的消息
String status ="服务器端操作成功";
System.out.println("服务器端的status是:"+status);
callback.process(status);
}
}
package cn.hpy.com;
public class MainTest {
public static void main(String[] args) {
Server server =new Server();
Client client = new Client(server);
client.sendMsg("hello world");
}
}
输出结果为:
客户端发送的消息为:hello world
服务端收到的消息为: hello world
服务器端的status是:服务器端操作成功
客户端收到的status是服务器端操作成功