使用Mqtt的时候用到了回调,消息到达和连接上时触发回调函数的执行。
java的回调类似于C#中的委托,事件。和函数接口,函数式接口(@FunctionalService),lambda紧密相关。一些常用的设计模式如发布订阅模式都使用了回调。
一个含有委托类的类负责委托中函数的触发时机,如鼠标移动到指定位置并点击触发一个事件(回调),回调(委托事件)类的函数的具体执行的实现,延后到实现委托类接口的类中。这样就减少了耦合性,增加了功能实现的灵活性,可以实现更复杂的功能。
下边自己实现一个智能温控计的功能,使用回调实现,到达报警温度时,停止加热并报警的功能。
先上回调类,用一个函数式接口实现,内部定义一个方法
package com.example.Callback;
@FunctionalInterface
public interface TempratureCallBack {
void warnTemprature(int temprature);
}
智能温控计登场
package com.example.Callback;
import lombok.SneakyThrows;
public class SmartThermometer extends Thread{
private TempratureCallBack tempratureCallBack;
private int warnTemprature;
public SmartThermometer(int warnTemprature){
this.warnTemprature=warnTemprature;
}
public void setCallBack(final TempratureCallBack callBack){
this.tempratureCallBack=callBack;
}
@SneakyThrows
public void run() {
int temprature=0;
if(warnTemprature>0){
for(;temprature<20000000;temprature++){// 模拟温度升高
System.out.println("当前温度"+temprature);
Thread.sleep(100);
if(temprature==warnTemprature){
if(this.tempratureCallBack!=null){
tempratureCallBack.warnTemprature(warnTemprature);
stopHot();
break;
}
}
}
}
}
private void stopHot(){
System.out.println("停止加热!");
}
}
最后定义一个回调实现类,并测试智能温控计的功能
package com.example.Callback;
public class TestCallBack {
static SmartThermometer smartThermometer=new SmartThermometer(20);
public static void main(String[] args) throws InterruptedException {
smartThermometer.setCallBack(new MyCallBack());
smartThermometer.start();
smartThermometer.join();
}
}
class MyCallBack implements TempratureCallBack{
@Override
public void warnTemprature(int temprature) {
System.out.println("******回调输出****\n温度已经到达警戒温度:"+temprature);
}
}
这样写更专业点
package com.example.Callback;
import lombok.SneakyThrows;
public class SmartThermometer {
private TempratureCallBack tempratureCallBack;
private int warnTemprature;
public SmartThermometer(int warnTemprature) {
this.warnTemprature = warnTemprature;
}
public void setCallBack(final TempratureCallBack callBack) {
this.tempratureCallBack = callBack;
}
// 开始加热
public void startHot() {
int temprature = 0;
if (warnTemprature > 0) {
for (; temprature < 20000000; temprature++) {// 模拟温度升高
System.out.println("当前温度" + temprature);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (temprature == warnTemprature) {
if (this.tempratureCallBack != null) {
tempratureCallBack.warnTemprature(warnTemprature);
stopHot();
break;
}
}
}
}
}
private void stopHot() {
System.out.println("停止加热!");
}
}
public class TestCallBack {
static SmartThermometer smartThermometer=new SmartThermometer(20);
public static void main(String[] args) throws InterruptedException {
// smartThermometer.setCallBack(new MyCallBack());
smartThermometer.setCallBack(CustomService::warnTemprature);
Thread t=new Thread(smartThermometer::startHot);
t.start();
t.join();
}
}
class MyCallBack implements TempratureCallBack{
@Override
public void warnTemprature(int temprature) {
System.out.println("******回调输出****\n温度已经到达警戒温度:"+temprature);
}
}
class CustomService {
public static void warnTemprature(int temprature) {
System.out.println("******回调输出****\n温度已经到达警戒温度:"+temprature);
}
}
输出结果
当前温度0
当前温度1
当前温度2
当前温度3
当前温度4
当前温度5
当前温度6
当前温度7
当前温度8
当前温度9
当前温度10
当前温度11
当前温度12
当前温度13
当前温度14
当前温度15
当前温度16
当前温度17
当前温度18
当前温度19
当前温度20
**回调输出
温度已经到达警戒温度:20
停止加热!