java的回调

使用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
停止加热!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值