【juincen】Java中的接口interface类比js中的回调函数

前几天在左讯飞语音的时候,无意间意识到java中的接口和js中常用的回调函数有点类似,今天在这儿整理一下思路。

interface,Java中的接口,为什么会有这个东西。

一,预留声明

比如两个程序员A和B,A要写一段程序,其中需要调用到B写的程序。这时候A可以写一个接口:

public interface Demo{
  
  void deal();      
}

A要调用的方法先“预留声明”在接口里:deal

然后B去完善这个接口,B写了一个实现类实现了这个Demo接口。

A在自己的业务逻辑里面只用调用接口的方法就可以了,至于具体怎么实现,不管他,留给B去做。

二,API

我在做讯飞语音的时候,有这样一段逻辑,调用讯飞语音的语音识别API。

其中有个讯飞API的接口类 RecognizerListener,这个接口是需要我来实现的,里面有好几个方法,我需要都实现,然后把这个接口的实例(对象)传给讯飞,

讯飞识别完成后,调用这个接口里面的方法(回调函数),这时候接口的功能体现出来了。(讯飞并不知道识别完成后,我要干什么事,所以他预留了接口,我实现了给讯飞,他来调用)

在返回结果的时候,我需要对识别的结果(字符串)进行处理,

//1.创建SpeechRecognizer对象
SpeechRecognizer mIat= SpeechRecognizer.createRecognizer( );
//2.设置听写参数,详见《MSC Reference Manual》SpeechConstant类
mIat.setParameter(SpeechConstant.DOMAIN, "iat");
mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
mIat.setParameter(SpeechConstant.ACCENT, "mandarin ");
//3.开始听写
mIat.startListening(mRecoListener);
//听写监听器
private RecognizerListener mRecoListener = new RecognizerListener(){
     //接口方法需要实现
	public void onResult(RecognizerResult results, boolean isLast){
       
       //在这里得到时语音别结果,按照我的业务逻辑来处理结果,每个人写的都不同。这个方法讯飞调用了,我只用实现
  DebugLog.Log("Result:"+results.getResultString ()); } //会话发生错误回调接口 public void onError(SpeechError error) { error.getPlainDescription(true) //获取错误码描述   } //开始录音 public void onBeginOfSpeech() {} //音量值0~30 public void onVolumeChanged(int volume){} //结束录音 public void onEndOfSpeech() {} //扩展用接口 public void onEvent(int eventType,int arg1,int arg2,String msg) {} };

  在开发API的时候常常需要用到接口,给调用者使用,因为你不知道调用者要怎么实现他自己的业务逻辑,那就给他个接口让他自己写去呗!

js中的回调函数,例如jQuery的ajax,

$.ajax({
    url:"",
    type:"",
    success:function(){
      //回调函数,这里实现自己的逻辑   
    }
});

  js中直接传一个函数过去,

  java中需要传一个接口对象过去,系统来调用这个接口对象里面的方法。

posted @ 2017-11-21 19:22  juincen  阅读(331)  评论(0编辑  收藏  举报

{"juincen":"指尖上的艺术家"}