回调函数(callback Function)

【c++】回调函数(callback function) 之前没有用过回调函数,这次突然用上,搜了一下其他大佬写的文章,看完之后还是云里雾里,所以决定自己从最简单的入手重新梳理一遍。 1.回调函数的概念 所谓回调函数,就是把其他函数作为自己的参数。 这里涉及到取地址的概念,为了思路不那么乱我们重新梳理一遍: 对于一个参数A,&A是取A的地址; 对于一个地址address,*address是取该地址下的值。 (int* b = &a; 对于... 阅读详情
一、概念介绍

    回调函数(callback Function),顾名思义,就是为被调用方所反过来调用的函数,比如说客户程序Client调用了服务端Server中的某个函数serverMethod,在执行过程中Server又反过来调用Client中的某个函数clientMethod(出于扩展机制的考虑),那么这个被Server调用的函数clientMethod就叫做回调函数,那么既然是为被调用方反过来调用的方法那么被调用方法如何得知这个方法的定义呢 ?那么就需要调用方和调用方就需要事先有个约定,这个约定就是“回调接口”,双方安装回调接口规范编写程序,就可以是实现回调逻辑,

回调的作用:通常是Server端不知道如何处理或处理逻辑依赖Client端逻辑,就通过回调的方式进入到Client的方法栈,回调也可以通常也用来实现Server端的扩展机制,如Server端开发回调接口,不同的回调接口实现以完成不同的业务需求,在spring框架中使用了很多的回调设计,如spring的hibernate集成(在hibernate中执行以获取响应结果),如spring提供的jndi工具  JndiTemplate , 也是利用回调实现,源码片段如下:

/**
 * Callback interface to be implemented by classes that need to perform an
 * operation (such as a lookup) in a JNDI context. This callback approach
 * is valuable in simplifying error handling, which is performed by the
 * JndiTemplate class. This is a similar to JdbcTemplate's approach.
 */
public interface JndiCallback {
    
	/**
	 * Do something with the given JNDI context.
	 * Implementations don't need to worry about error handling
	 * or cleanup, as the JndiTemplate class will handle this.
	 */
  Object doInContext(Context ctx) throws NamingException;

}

/**
 * Execute the given JNDI context callback implementation.
 * org.springframework.jndi.JndiTemplate 的源代码
 */
public Object execute(JndiCallback contextCallback) throws NamingException {
	Context ctx = createInitialContext();
	try {
		return contextCallback.doInContext(ctx);
	}
	finally {
		try {
			ctx.close();
		}
		catch (NamingException ex) {
			logger.warn("Could not close JNDI InitialContext", ex);
		}
	}
}

从上面的代码,可知道, JndiTemplate 持有了 JNDI 的上下问对象,默认提供了一些访问jndi的方法,但如果用户想使用jndi的上下文做些定制化的事情就需要通过“回调接口”的回调机制来实现,因为用户没有对jndi上下文的引用,JndiTemplate 也没有对外开放,所以可以通过回调方式来使用jndi上下,这样就可以在不改变JndiTemplate代码的情况下,实现扩展,JndiTemplate持有了jndi上下文的引用可以通过回调接口,在用户调用execue时候,获取到用户的实现的回调接口,调用接口定义的方法,这样就进入了用户的方法栈(用户调用JndiTemplate,JndiTemplate又反过来调用用户定义的逻辑,这就是回调机制),用户的逻辑返回的结果被JndiTemplate拿到后再转给用户,这样用户就能使用到 jndi的上下做些自己的事情了,当然 JndiTemplate 既然是工具类,自然已经实现了很多方便方法,这样方法也都是通过回调实现的,一饱眼福吧:

public Object lookup(final String name) throws NamingException {
		if (logger.isDebugEnabled()) {
			logger.debug("Looking up JNDI object with name [" + name + "]");
		}
		return execute(new JndiCallback() {
			public Object doInContext(Context ctx) throws NamingException {
				Object located = ctx.lookup(name);
				if (located == null) {
					throw new NameNotFoundException(
							"JNDI object with [" + name + "] not found: JNDI implementation returned null");
				}
				return located;
			}
		});
	}
public void bind(final String name, final Object object) throws NamingException {
		if (logger.isDebugEnabled()) {
			logger.debug("Binding JNDI object with name [" + name + "]");
		}
		execute(new JndiCallback() {
			public Object doInContext(Context ctx) throws NamingException {
				ctx.bind(name, object);
				return null;
			}
		});
	}
public void rebind(final String name, final Object object) throws NamingException {
		if (logger.isDebugEnabled()) {
			logger.debug("Rebinding JNDI object with name [" + name + "]");
		}
		execute(new JndiCallback() {
			public Object doInContext(Context ctx) throws NamingException {
				ctx.rebind(name, object);
				return null;
			}
		});
	}

public void unbind(final String name) throws NamingException {
		if (logger.isDebugEnabled()) {
			logger.debug("Unbinding JNDI object with name [" + name + "]");
		}
		execute(new JndiCallback() {
			public Object doInContext(Context ctx) throws NamingException {
				ctx.unbind(name);
				return null;
			}
		});
	}




二、原理图


三、示例代码

class AppContext {
    String data;
    public AppContext(String data) {
        this.data = data;
    }
    Object process() {
        return "process:" + data;
    }
}

interface CallBackInterface {
    Object doInContext(AppContext context);
}

class ServerPoint {
    AppContext appContext = new AppContext("ServerData");

    Object execute(CallBackInterface callBack) {
        return callBack.doInContext(appContext);
    }
}

public class CallbackTest {
    static ServerPoint serverPoint = new ServerPoint();

    public static void main(String[] args) {
        Object executeData = serverPoint.execute(new CallBackInterface() {
            public Object doInContext(AppContext context) {
                String process = (String) context.process();
                System.out.println("客户端使用使用服务器资源AppContext处理数据");
                return process;
            }
        });
        System.out.println(executeData);
    }
}


结果:

客户端使用使用服务器资源AppContext处理数据
process:ServerData


深入理解 JavaScript 回调函数 JavaScript回调函数是成为一名成功的 JavaScript 开发人员必须要了解的一个重要概念。但是我相信,在阅读本文之后,你将能够克服以前使用回调方法遇到的所有障碍。 在开始之前,首先要确保我们对函数的理解是扎实的。 快速回顾:JavaScript 函数 什么是函数? 函数是在其中有一组代码的逻辑构件,用来执行特定任务。实际上为了易于调试和维护,函数允许以更有组织的方式去编写代码。函数还允... 阅读详情

相关推荐

通俗理解“回调函数”

C++回调函数 1. 什么是回调函数? 系统函数使用你的程序函数就叫回调。具体来说: 函数 F1 调用函数 F2 的时候,函数 F1 通过参数给函数 F2 传递了另外一个函数 F3 的指针,在函数 F2 执行的过程中,函数F2 调用了函数 F3,这个动作就叫做回调(Callback),而先被当做指针传入、后面又被回调的函数 F3 就是回调函数。 总结一句话就是:函数也可以作为函数的参数来传递 2. 为什么要使用回调函数? #include<stdio.h> #include<

qq_41924554的博客 699

回调函数(callback functions)的理解和使用

回调函数就是一个被作为参数传递的函数。在C语言中,回调函数只能使用函数指针实现,在C++、Python等更现代的编程语言中还可以使用仿函数或匿名函数实现。回调函数的使用可以大大提升编程的效率,这使得它在现代编程中被非常多地使用。同时,有一些需求必须要使用回调函数来实现。最著名的回调函数调用有C/C++标准库/cstdlib中的快速排序函数和函数中都会要求的一个与类似的参数,用于设置数据的。

margaret522的博客 3272

add callback function 添加回调函数

add callback function 添加回调函数》这是一个NX二次开发官方小例子,下面是代码和解析。相较于混乱、未经验证的代码,官方案例能够确保开发者获得准确的开发方法,这些官方示例代码经过严格测试,能够正确地反映出NX软件的功能和API使用方式,有助于开发者系统地掌握NX二次开发技能,提高开发质量和效率。本专栏订阅后是永久阅读的。欢迎一起学习NX二次开发案例,逐步积累宝贵的经验,早日成为行业专家。

王牌飞行员_里海的博客 544

什么是回调函数(callback function)?

什么是回调函数(callback function)?

商务合作欢迎私信我 8066

[AbutionGraph] 报表制作-使用Grafana动态可视化知识图谱指标

使用开源报表可视化工具Grafana实时监控时序知识图谱数据仓库AbutionGraph中的数据,实时性报表查询, 满足单次百万千万级的数据查询,毫秒级查询延迟,亚秒级对千亿数据量汇总统计,每日过亿报表查询/多维分析/日志分析等数据指标...

图特摩斯科技-博客 4278

别再乱选WiFi信道了!手把手教你用WiFi Analyzer优化2.4G/5G家庭网络(附避坑指南)

本文详细介绍了如何使用WiFi Analyzer工具优化家庭WiFi网络,解决2.4GHz和5GHz信道的冲突问题。通过分析信道拥堵原因、提供安装使用指南及优化策略,帮助用户显著提升网络速度与稳定性,特别适合密集住宅区和多设备家庭。

weixin_42665725的博客 5879

Callback Function(回调函数)

回调函数

2401_82469419的博客 1448

Android BluetoothSocket

BluetoothSocket是Android中用于在蓝牙设备之间进行数据传输的一种Socket。它提供了一种类似于TCP/IP协议的数据传输方式,可以在两个设备之间建立一个虚拟的通信管道,使得两个设备之间可以进行数据的传输和接收。BluetoothSocket可以用于客户端和服务端之间的通信,通过BluetoothSocket可以实现数据的双向传输。

liuning1985622的博客 1477

回调函数 callback function

先简单理解它的功能,打个比方,有一家旅馆提供叫醒服务,但是要求旅客自己决定叫醒的方法。可以是打客房电话,也可以是派服务员去敲门,睡得死怕耽误事的,还可以要求往自己头上浇盆水。这里,“叫醒”这个行为是旅馆提供的,相当于库函数,但是叫醒的方式是由旅客决定并告诉旅馆的,也就是回调函数。而旅客告诉旅馆怎么叫醒自己的动作,也就是把回调函数传入库函数的动作,称为登记回调函数(to register a cal

abc58396683的博客 701

BUUCTF--[OGeek2019]babyrop

才学习了基本的ROP流程,到处找题练,不过也没做出来几道题,以这道32位的题作为例题吧。 这道题是BUUCTF上pwn练习题里的[OGeek2019]babyrop。 代码审计 老规矩先checksec一下: 没有canary保护,nx保护开启排除shellcode可能性,FULL RELEO为地址随机化。 观察主函数,先设定了一个闹铃,到时间就会强制退出程序,解除闹铃的方法在上一篇博客中提到过了, 这道题中闹铃函数依然对我们解题起不到什么干扰作用。 主函数的思路大概是:生成一个随机数,把这个随机数作为

N1rvana的博客 6005

AutoSAR EcuM系列01- EcuM模块的功能概述和变体类型

在【ECU的软硬件架构】文章中我们了解ECU的功能和组成,那么ECU具体是怎么启动的呢?我们知道,AutoSAR标准架构有三层,即APPL应用层、RTE层和BSW层。而这些层又被进一步划分为更多单独的组件,如BSW层可能有80多个组件。在ECU启动时,这些组件必须相互交互,有时也必须以某种顺序交互。这些组件的启动顺序由ECU管理器模块或EcuM处理。EcuM负责整个ECU的初始化和去初始化,包括对一些系统模块如。......

1766

回调函数(Callback Function)

回调函数(Callback  Function)什么是回调函数?    回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃。通常情况下,回调函数采用标准WindowsA

zhangxin2208的专栏 3230

【NI Multisim 14.0编辑环境——项目管理器】

主窗口包括标题栏、菜单栏、工具栏、工作区域、电子表格视图(信息窗口)、状态栏及项目管理器7个部分。 上期我们了解了工具栏,今天我们继续了解项目管理器。 一、项目管理器 在原理图设计中经常用到的工作面板有“设计工具箱”面板、“SPICE网表查看器”面板及“LabVIEW 协同仿真终端”面板。 1.“设计工具箱”面板 基本位于工作界面左侧,主要用于层次电路的显示。启动软件,默认创建的“设计1”以分层的形式显示出来。 那么如何打开“设计工具箱”面板呢?如图所示:在该面板中显示 SPICE 网表的输入,输出

RL2698853114的博客 2035

什么是回调函数(callback function)

生动的描述: 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。

代码菌的blog 2万+

HyperLynx(十五)多板仿真

在对话框的“Design file#1”下拉列表中选择“B00,Mainboard”,在其下方的“Reference designators”列表中选择元器件“J1”,然后在“Designfile#2”下拉列表中选择“BO1、RAM1”,在其下方的“Refer ence designators”列表中选择元器件“J1”,单击“Insert”按钮,为这两个元器件建立互连映射。在“Assign Models”对话框中,选择“B00 Motherboard”,将“U16.B12”设置为输出。

小幽余生不加糖 5060

java零基础从入门到精通(全)

目录前言1. 入门知识1.1 java体系1.2 JDK/JRE/JVM区别1.3 编译与运行理解1.4 类体函数细节2. 标识符 前言 java优势 健壮性(JVM(C++语言写的一个虚拟的计算机)、GC(垃圾回收机制)) 多线程并发 可移植性/跨平台 1. 入门知识 1.1 java体系 JavaSE:标准版 JavaEE:企业版 JavaME:微型版 1.2 JDK/JRE/JVM区别 JVM是不能独立安装的。 JRE和JDK都是可以独立安装的 层层嵌套,jvm包括jdk,jdk包括jre

码农研究僧的博客 6万+

回调函数(Callback Function)

在 C++ 中,回调函数通常指一个函数作为参数传递到另一个函数中,当某个事件发生时,被调用的函数会“回调”传入的函数。回调函数就是一个通过参数传递到其他函数中的函数,通常由目标函数在某个特定时机被调用。回调函数是一种允许你将函数作为参数传递的机制,通常用于实现灵活的事件处理、异步操作和函数封装。你可以通过传入回调函数的方式,在数据到达时执行回调。Lambda 表达式是 C++11 引入的匿名函数,具有简洁的语法和强大的功能,尤其适合用作回调函数。通过函数对象,可以更加灵活地定义回调函数,并且可以持有状态。

TsuanS13的博客 1950

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C++回调函数 callback function()

mark一下学习笔记,加深印象! 1.软件系统的分层: 在我们遇到的实际算法工程项目中,我们希望整个软件系统的分层如下图所示: 应用层:位于最上层,也就是提供给用户的功能接口,例如人脸活体检测接口。可以供用户的main函数直接调用,依赖于中间层 中间层:位于中间层,为应用层的功能函数提供动态库函数接口,例如综合多种人脸活体检测算法的接口,依赖于底层算法层 底层:位于最底层,为中间层提供需要单种算法sdk 分层后,我们希望函数调用关系都是从上到下,以确保单向依赖! 为啥要保证单向依赖?这样做的好处,可以.

weixin_42096202的博客 1828

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C语言中callback回调函数,C语言中的回调函数(Callback Function)

1 定义和使用场合回调函数是指 使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数。函数是你实现的,但由别人(或系统)的函数在运行时通过参数传递的方式调用,这就是所谓的回调函数。简单来说,就是由别人的函数运行期间来回调你实现的函数。这一设计允许了底层代码调用在高层定义的子程序(如图1-1所示)。C...

weixin_28366053的博客 989

回调函数 Callback Function

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。  (1)定义一个回调函数;  (2)提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;  (3)当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。

I&U 655

回调函数callback function

原文:http://www.rosoo.net/a/200611/6372.html 简单的说,如果你使用了某个function,那麽你就是『call』了一个function。如果系统或是函式是要求你给一个function pointer,这个function pointer指到一个实际的函式(多半这个函式是你自己写的)。然後它会在适当的时间呼叫此function,则此function就

grantxx的专栏 2346

回调函数(CallBack Function)

什么是回调函数? 用一句话来形容:回调函数还真有点像您随身带的BP机,告诉别人号码,在它有事情时Call您。换句话说,模块A将一个函数以函数指针的形式注册到模块B,模块B满足一定条件时来调用模块A注册过来的函数,来完成一定的功能,这个过程就是函数的回调。 什么时候调用回调函数? 我们可以把C中完成这个功能的主函数以指针的形式注册到S中,并且保存在S中,当然这个函数的参数可

781

回调函数callback function的机制及使用举例

如果把函数指针传递给另一个函数(调用者),当调用者执行时,函数指针所指的函数也被执行。被调用的函数就是回调函数。 回调函数实现的机制是 1、定义一个回调函数;  2、提供函数实现的一方在初始化的时候,通过注册函数 向调用者(管理单元/调度函数)注册回调函数的函数指针。  3、当特定的事件发生时候,调用者使用函数指针调用回调函数对事件进行处理。 举例: Quagga0.9.22中OSPF...

刘一凡的博客 7851

【Linux C】回调函数(Callback function)

关于回调函数,感觉C语言回调函数详解 - 江召伟 - 博客园 (cnblogs.com)这篇文章讲述的非常好,感谢原作者的分享。 1. 什么是回调函数? 网上众说纷纭,看了很多都没理解到位。下面列出 Wiki 和 Stack Overflow 上的表述。 Wiki 对回调(Callback)的解析:In computer programming, a callback is any executable code that is passed as an argument to other cod..

老农民娃哈哈的博客 1653

理解一下回调函数Callback Function

在知乎上看到一个很好的解释用来理解回调函数的过程。 大致是说 你去宾馆了然后向前台告知明天六点叫我起床,这句话就大致说明了两个Function 1.我请求叫醒服务 2.宾馆记录下来到具体时间点叫醒你。 这里说明一下:就是你去约定一个时间点之后或者给个标志什么的 当条件满足的时候 宾馆方面就执行方法二,在条件未满足之前你可以去做任何事,不妨碍宾馆方面的执行。 用代码实现这里的逻辑如下:

Chauncymaster的博客 1768

callback function 回调函数

回调函数   在看LWIP时,见到用回调函数,再看某老外公司OPC源代码时,见到用回调函数。看我国内某些代码(我公司软件等)时没用到。于是,我对回调函数产生了很大的好奇。以前,我写VC程序时用到过回调函数,但是没有用C语言来使用。最近,看到国外大量的经典代码中广泛使用了回调函数(LWIP、某两个公司的OPC程序等),都是C语言来实现的,而不是VC windows程序中别人实现自己使用的那种。

crazy_programmer_p的专栏 724
上一篇: 行为型模式之模板方法模式(Template Method)
下一篇: 创建型模式之抽象工厂模式(Abstract Factory)- 工厂方法模式(Factory Method)
conquer0715
博客等级 码龄18年 73粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值