回调函数

我理解的回调函数就是调用者并非函数的实现者。

应用场景:比如我一直在做的字幕模块,输入是视频流中的原始字幕数据,输出时直接调用输出模块的绘制接口,并将字幕坐标,字幕内容,字幕样式等信息传入。问题来了,我在实现模块的时候并不知道输出设备是啥,甚至是Linux还是android都不知道,肿么办?用回调函数啊。声明一个函数指针,实现一个注册函数用于初始化这个函数指针,我在字幕模块中就用这个指针指向的函数来绘制,而这个函数的实现我完全不在意,用户在实现业务时候自然会去实现绘制函数,并通过注册函数告诉我其实我调的绘制函数是哪一个。

以上是c的思路,java没有指针的概念,所以只能用接口来实现了。


c回调函数,利用函数指针实现

Caller.h 

#ifndef CALLER_H_
#define CALLER_H_

typedef void (*HELLO_CB_FN)(void);
void registerCB(HELLO_CB_FN helloCB);
void hello();

#endif

Caller.c 

#include "Caller.h"

HELLO_CB_FN hello_cb;

void registerCB(HELLO_CB_FN helloCB)
{
    hello_cb = helloCB;
}

void hello()
{
    hello_cb();
}


TestMain.c

#include <stdio.h>
#include <stdlib.h>
#include "Caller.h"

void hello_()
{
    printf("hello world!!!");
}

int main(void)
{
    registerCB(hello_);
    hello();
    return EXIT_SUCCESS;
}

java回调函数,利用接口实现

CallbackInterface.java
package com.example.callback;

public interface CallbackInterface {
	public void helloWorld();
}

Callee.java 
package com.example.callback;

public class Callee implements CallbackInterface{

	@Override
	public void helloWorld() {
		System.out.println("hello world!from callback fun~~");
	}
}

Caller.java 
package com.example.callback;

public class Caller {
	
	private CallbackInterface mCallbackInterface;
    	
	public void registerCallback(CallbackInterface mCallbackInterface)
	{
		this.mCallbackInterface = mCallbackInterface;
	}
	
	public void helloWorld()
	{
		mCallbackInterface.helloWorld();
	}

}

TestMain.java
package com.example.callback;

public class TestMain {
	//回调函数:调用者非函数的实现者
	public static void main(String[] args){	
		Caller mCaller = new Caller();
		//先注册
		mCaller.registerCallback(new Callee());
		//再使用
		mCaller.helloWorld();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值