回调其实并不难吧

本文深入解析了接口与回调的概念,探讨了它们在软件设计中的重要性。通过对比USB接口和手机数据线,解释了接口如何作为规范促进不同组件间的协作。回调函数作为一种特殊的函数指针,用于响应特定事件或条件,通过示例展示了回调在不同层次间协作的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初看回调

【2020年5月9号 23:33:00】五一小长假后的一周,做的项目,终于测试完成,明天能稍微歇歇了。


0. interface

(1) 接口是一种规范,例如,电脑的USB接口。设计电脑的人不用关心用户将会把什么东西插到USB接口上,同样,设计手机数据线的人也不用考虑用户将会把手机的数据插到什么牌子的电脑上,但是唯一需要设计者在乎的是,他们都必须要遵从某个协议。这样子,我们使用者就能将任何数据线和任何牌子的电脑相连接,并能进行数据的传递了。

我觉得这就是要在回调中使用接口的原因了,因为你在写注册的方法时候,你并知道谁会去调用用接口中的方法,也不需要知道调用者是如何具体实现接口中的方法的,你要做的就是,规定好,当满足条件后,调用这个方法即可。

(2) 接口是Java中一种重要的数据类型,用接口声明的变量称之为接口变量,如,List<?> mList = new ArrayList<>(); 这里的mList就是接口变量。接口属于引用变量,接口变量中可以存放实现该接口的类的实例的引用,即存放对象的引用,如,private ICallback mCallback = new ICallback() {…},mCallback中存放的就是实现ICallback接口的类的实例的引用【 这里使用的是,创建接口的匿名实现类的非匿名对象

1. 回调

(1) 定义: 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
链接🔗: 百度百科–回调函数

说白了就是,A类调用B类中的c()方法,然后B类再反过来调用A类中的d()方法。反过来调用方法d()的这一步,就叫作调用回调接口。

回调示意图

(2) 什么时候使用回调

回调一磅用于不同层次间的相互协作,在上层代码中,将这一层的函数放到下层中(这个函数就是回调函数),而在下层中,当满足某一条件的时候,这个回调函数会被触发。(所谓的下层代码可以认为是底层代码,就是开发者已经写死的代码,上层的代码,是说交给使用者,使用者可以根据具体的情况进行修改)

举个栗子:
出门旅游住宾馆,宾馆可能会提供早晨叫醒服务,宾馆可以看成是下层(底层),宾馆已经存在叫醒服务。客人可以看作是上层,客人只需要去前台预订一下叫醒服务,转天就能收到叫醒服务

(3) 实现步骤

step1: 定义回调接口ICallback
step2: 在class A中实现回调接口ICallback,同时持有class B的对象b
step3: 在class B中有一个含有参数类型为ICallback参数的方法c(ICallback callback)
step4: 由于class A持有class B的对象,所以class A可以调用class B的方法c(arg0),并将ICallback接口的引用作为参数传进来
step5: 然后b就可以在方法c(arg0)执行完毕后,调用class A中的方法d()

2. 代码

Hotel类的代码
Customer类
测试类
输出:
旅客预定了叫醒服务…
一宿过去了, 天亮了…
被叫醒了…


说明
class A相当于class Customer,class B相当于class Hotel
step1: 在Customer类 中定义回调接口IWakeUpServiceCallback,接口中定义了一些方法。
step2: Customer类 实现回调接口IWakeUpServiceCallback,同时持有Hotel的对象
step3: 在Hotel类 中有一个registerWakeUpService(IWakeUpServiceCallback callback)方法,参数是IWakeUpServiceCallback接口类型
step4: 由于Customer类持有Hotel的对象,所以Customer可以调用Hotel的registerWakeUpService(arg... )方法,并将IWakeUpServiceCallback接口的引用作为参数传进来
step5: 在Hotel类中,调用回调方法 wakeUpService()
注: 这里不一定要定义一个register注册的方法,也可以是一个构造器,同样可以将接口的引用传进来。

在Android中涉及大量的回调,包括Android自带的点击监听事件、动画的开始结束监听事件…,还有自定义的一些事件监听器。


【TODO】目前我看好多回调接口都是写在一个class的内部,不知道这是个人习惯问题还是有一些其它的设计方式。不过看到《Thinking in Java》中提到了内部类和闭包的问题。看来明天还要抽时间再研究一下。(未完.... ...待续)


============================== 分割线 ==============================
markdown好像还没有语法高亮?写的代码都一个颜色的,看着有点不太习惯。于是在carbon上写完代码,把代码直接粘过来了。

Python 和 JavaScript 的难易程度其实取决于具体的使用场景以及个人的学习背景。这两种语言都有各自的特点和优势,因此很难绝对地说哪一个更难。下面我会详细比较这两者的语法、学习曲线以及应用场景等方面的内容。 --- ### **1. 语法复杂度** - **Python** - Python 的语法非常简洁清晰,强调代码的可读性和一致性。 - 使用缩进来表示代码块,减少了括号的使用,初学者更容易理解程序结构。 - 数据类型明确(如 `int`, `float`, `str`),变量不需要显式声明类型,降低了入门门槛。 - 示例代码: ```python def greet(name): print(f"Hello, {name}!") greet("Alice") ``` - **JavaScript** - JavaScript 的语法较为灵活但也稍微复杂一些,尤其是在处理异步操作时会涉及回调函数、Promise 等高级概念。 - 变量声明可以选择 `var`, `let`, 或 `const`,需要根据作用域规则选择正确的关键词。 - 允许动态修改对象属性及原型链机制,增加了灵活性的同时也提升了学习难度。 - 示例代码: ```javascript function greet(name) { console.log(`Hello, ${name}!`); } greet('Bob'); ``` --- ### **2. 应用场景** - **Python** 主要应用于以下领域: - 后端开发 (Django, Flask框架) - 科学计算与数据分析 (`numpy`, `pandas`) - 自然语言处理(NLP),机器学习(ML),深度学习(DL)等人工智能相关方向 - **JavaScript** 常见的应用包括但不限于以下几个方面: - 客户端网页交互(浏览器内置支持) - 节点服务器(Node.js)构建全栈解决方案 - 桌面应用程序开发(Electron平台) 由于两者的目标定位不同,在特定环境中某一种可能会显得更为困难或容易上手。 --- ### **3. 生态系统&社区资源** 两门语言都拥有庞大的生态系统和技术文档库供开发者参考借鉴。 对于新手来说,丰富的教程资料可以帮助缓解初期遇到的问题压力;而对于经验丰富的工程师而言,则意味着更多现成组件可用以加速项目进度。 不过值得注意的是,因为Javascript主要用于前端页面渲染效果制作,所以涉及到CSS样式表联合调试等工作内容的时候,整体感知难度或许会有所上升。 --- 综上所述,没有确切的答案表明哪种语言一定比另一种更加难以掌握。关键在于你的兴趣爱好和个人发展目标是什么样的——如果你倾向于从事Web前端方面的事业那么毫无疑问应该优先考虑深入研究JS及其周边技术栈;而假如你对科研探索或者企业后台服务感兴趣的话,那显然Python将会成为更好的起点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值