在知乎上看到一个很好的解释用来理解回调函数的过程。
大致是说 你去宾馆了然后向前台告知明天六点叫我起床,这句话就大致说明了两个Function 1.我请求叫醒服务 2.宾馆记录下来到具体时间点叫醒你。
这里说明一下:就是你去约定一个时间点之后或者给个标志什么的 当条件满足的时候 宾馆方面就执行方法二,在条件未满足之前你可以去做任何事,不妨碍宾馆方面的执行。
用代码实现这里的逻辑如下:
1.首先需要一个回调函数的接口,双方的一种约定。
2.Guest和Hotel的实体类,这里Guest需要Hotel的引用,因为服务是 Hotel提供的。其次开启一个单独的线程,来表示双方各自工作的关系。
同样Hotel只需要一个具体服务的引用(Callback接口)和具体内容(这里是时间)
简单理解一下:
接口:Callback
package com.callback.demo;
public interface Callback {
public void callback(String result);
}
具体实现类Guest
package com.callback.demo;
public class Guest implements Callback {
Hotel hotel;
public Guest(Hotel hotel) {
this.hotel=hotel;
}
//客人的告诉宾馆叫醒服务(时间)
public void awake(String date ) {
System.out.println("走到前台。。。要求服务");
//宾馆登记
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
hotel.recordAndWake(Guest.this, date);
}
}) {
}.start();
//等待服务办理
System.out.println("等待服务办理");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
doOtherThing();
}
//长夜慢慢 无心睡眠
void doOtherThing() {
System.out.println("吃吃宵夜。。。。。。");
System.out.println("睡觉了。。。。。。等待叫醒");
}
@Override
public void callback(String result) {
// TODO Auto-generated method stub
System.out.println("hotel=============叫醒服务"+result);
}
}
Hotel
package com.callback.demo;
public class Hotel {
//提供的服务 需要服务对象 以及服务内容
public void recordAndWake(Callback callback,String date) {
System.out.println("hotel记录时间为====="+date);
//模拟长夜慢慢
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
date="时间到了。。。。客人";
callback.callback(date);
}
}
test
package com.callback.demo;
public class TestCase {
public static void main(String[] args) {
// TODO Auto-generated method stub
Hotel hotel = new Hotel();
Guest guest = new Guest(hotel);
guest.awake("明天早上6.00");
}
}