熟悉MS-Windows和X Windows事件驱动设计模式的开发人员,通常是把一个方法的指针传递给事件源,当某一事件发生时来调用这个方法(也称为“回调”)。Java的面向对象的模型目前不支持方法指针,似乎不能使用这种方便的机制。

Java支持interface,通过interface可以实现相同的回调。其诀窍就在于定义一个简单的interface,申明一个被希望回调的方法。

例如,假定当某一事件发生时会得到通知,我们可以定义一个interface:
public interface InterestingEvent {
    // 这只是一个普通的方法,可以接收参数、也可以返回值
    public void interestingEvent();
}

这样我们就有了任何一个实现了这个接口类对象的手柄grip。

当一事件发生时,需要通知实现InterestingEvent 接口的对象,并调用interestingEvent() 方法。
class EventNotifier {
    private InterestingEvent ie;
    private boolean somethingHappened;

public EventNotifier(InterestingEvent event) {
        ie = event;
        somethingHappened = false;
    }

public void doWork() {
        if (somethingHappened) {
            // 事件发生时,通过调用接口的这个方法来通知
            ie.interestingEvent();
        }        
    }
}

在这个例子中,用somethingHappened 来标志事件是否发生。

希望接收事件通知的类必须要实现InterestingEvent 接口,而且要把自己的引用传递给事件的通知者。
public class CallMe implements InterestingEvent {
    private EventNotifier en;

public CallMe() {
        // 新建一个事件通知者对象,并把自己传递给它
        en = new EventNotifier(this);
    }

// 实现事件发生时,实际处理事件的方法
    public void interestingEvent() {
        // 这个事件发生了,进行处理
    }
}

以上是通过一个非常简单的例子来说明Java中的回调的实现。

当然,也可以在事件管理或事件通知者类中,通过注册的方式来注册多个对此事件感兴趣的对象。

1. 定义一个接口InterestingEvent ,回调方法nterestingEvent(String event) 简单接收一个String 参数。

interface InterestingEvent {
    public void interestingEvent(String event);
}

2. 实现InterestingEvent接口,事件处理类

class CallMe implements InterestingEvent {
    private String name;
    public CallMe(String name){
        this.name = name;
    }    
    public void interestingEvent(String event) {
        System.out.println(name + ":[" +event  + "] happened");
    }
}

3. 事件管理者,或事件通知者

class EventNotifier {
    private List<CallMe> callMes = new ArrayList<CallMe>();
    
    public void regist(CallMe callMe){
        callMes.add(callMe);
    }
    
    public void doWork(){
        for(CallMe callMe: callMes) {
            callMe.interestingEvent("sample event");
        }
    }    
}

4. 测试

public class CallMeTest {
    public static void main(String[] args) {
        EventNotifier ren = new EventNotifier();
        CallMe a = new CallMe("CallMe A");
        CallMe b = new CallMe("CallMe B");

// regiest
        ren.regist(a);
        ren.regist(b);
        
        // test
        ren.doWork();        
    }
}

调用API的SDK相关知识:实现回调函数.相关推荐

  1. C语言、嵌入式重点知识:回调函数

    前言 上文分享了一个专用的双链表的基本操作示例:双链表的操作示例(附代码) 这里提到了一个关键词:专用.与专用对应的词是通用. 我们从字面上可以很容易理解这两个词,专用就是针对特定情况的,特点就是很有 ...

  2. c向python注册函数_python如何调用C, 如何注册成C的回调函数(python后台程序常用方法)...

    其实是python后台程序常用方法: C开发完成底层的功能,python直接把C当做python模块进行调用. 需要做两个工作: python能调用C语言的函数: python通过调用C函数,并注册p ...

  3. tushare调用API获取金融相关数据

    首页:https://tushare.pro/ 整体的思路是: 首先获得token,可以参考官网教程 代码中传入token,调用接口 步骤 1. 获得token 首先进入网站:https://tush ...

  4. PHP实现调用淘宝SDK开放接口返回天猫或淘宝商品详情

    在淘宝开发平台申请到app key及app secret并在开放平台上的app tools在线测试成功以后,就可以在自己的项目中使用淘宝SDK来调用淘宝或天猫的商品详情了,包括标题.图片.价格等等所有 ...

  5. 【学习总结】-Apsara Clouder专项技能认证:实现调用API接口学习总结

    Apsara Clouder专项技能认证:实现调用API接口-学习总结 API的概念: API的特点: API的分类: 为什么要使用API 阿里云API市场 API请求与认证 Web API协议 HT ...

  6. C++回调函数中调用Python函数出现的死锁问题调试及解决

    一.查找死锁原因: 1.使用gdb exe指令进入gdb命令行,再输入r运行可执行文件 gdb /home/sdhm/catkin_ws/devel/lib/gpd_ros/gpd_server GN ...

  7. 回调函数 —— 借助中间通用函数(形参里有函数指针,实现函数注册)调用不同的回调函数 (多态/分层)

    回调函数传参:函数指针做函数参数(回调函数) 目录 背景 回调函数是实现函数分层且单向依赖的好办法,使用函数指针运行 struct结构体回调函数代码更清晰 简单理解回调函数 Demo 其他回调函数博文 ...

  8. lwIP 细节之三:TCP 回调函数是何时调用的

    使用 lwIP 协议栈进行 TCP 裸机编程,其本质就是编写协议栈指定的各种回调函数.将你的应用逻辑封装成函数,注册到协议栈,在适当的时候,由协议栈自动调用,所以称为回调. 注:除非特别说明,以下内容 ...

  9. buu(前三页第二弹) RSA习题与相关知识总结

    文章目录 buu [ACTF新生赛2020]crypto-rsa3 1 题目描述: 题目分析: 收获与体会: buu [WUSTCTF2020]情书 1 题目描述: 题目分析: 收获与体会: buu ...

最新文章

  1. 给自己提个醒:关于document.getElementsByName无法获取非表单元素
  2. halcon知识:hough变换检出图像的直线
  3. pta函数统计素数并求和_关于求和的4种函数公式,此文讲透了,尤其是第4种,绝对的高效...
  4. 偶然发现一个大佬写的 React 脚手架,叫Moderate, 用起来很方便
  5. C# 定义了 7 种变量类别:静态变量、实例变量、数组元素、值参数、引用参数、输出参数和局部变量
  6. 菜鸟进阶必修课-主板插线小百科(图)
  7. linux之我常用的20条命令(之二)
  8. 【论文写作】JSP在线考试系统如何写功能描述
  9. 自适应采样次数的Ransac算法
  10. 计算机桌面小工具软件,win10桌面小工具(Desktop Gadgets Installer)
  11. 基于Android的城市环境监测系统
  12. Typecho网站访问浏览总量统计插件PageViews升级版
  13. CentOS安装Nacos后,输入默认用户名和密码nacos/nacos,提示“用户名或密码错误”
  14. hdu 1548 A strange lift (BFS)
  15. Java是先难后易吗_做题先易后难,干活先难后易
  16. 2018读书清单与情况
  17. 设计模式(三):“花瓶+鲜花”中的装饰者模式(Decorator Pattern)
  18. 基于matlab的电流滞环控制,电流滞环控制matlab
  19. 关于protel99se建自己的库
  20. 应用系统外部接口数据稽核问题分析经历及经验分析

热门文章

  1. 【鸿蒙 HarmonyOS】UI 组件 ( 进度条 ProgressBar 和 RoundProgressBar 组件 )
  2. 【数据挖掘】关联规则挖掘 Apriori 算法 ( 关联规则性质 | 非频繁项集超集性质 | 频繁项集子集性质 | 项集与超集支持度性质 )
  3. 【计算机网络】网络层 : BGP 协议 ( BGP 协议简介 | BGP 协议信息交换 | BGP 协议报文格式 | BGP-4 常用报文 | RIP 、OSPF、BGP 协议对比 )
  4. 【Android 应用开发】Android之Bluetooth编程
  5. BinaryTreeTraversal(二叉树遍历)
  6. PHP将英文数字转换为阿拉伯数字 
  7. 【福利】微信小程序130个精选Demo合集
  8. maven仓库找不到需要的jar包解决办法-转载
  9. Django ORM 级联删除
  10. windows 域用户账号验证登陆