Java 之 回调方法
打个比方,我们点外卖都有到达提醒的服务,顾客自己选择提醒的方式。可以是电话提醒、短信提醒、也可以敲门提醒,这里,“提醒”这个行为是美团或饿了么这样的平台提供的,相当于库函数,但是提醒的方式是由顾客决定并告诉平台的,也就是回调函数。而顾客告诉平台怎么提醒自己的动作,也就是把回调函数传入库函数的动作,称为登记回调函数(to register a callback function)
很显然 回调 是一种设计模式,和代理一样都是通过 继承 接口来实现的(回调也可以通过抽象类)
1、回调的接口
package Interface;
/**
* 此接口为外卖提醒业务接口,提供了三种提醒方式
*/
public interface TakeOutServiceInterface {
/**
* 提醒方式:电话
*/
public void TelephoneReminderService(String PhoneNumber,String Content);
/**
* 提醒方式:短信
*/
public void MessageReminderService(String PhoneNumber,String Content);
/**
* 提醒方式:敲门
*/
public void KnockDoorReminderService(String Content);
}
2、客户端
package Service; import Interface.TakeOutServiceInterface;
public class Guest implements TakeOutServiceInterface {
private String _phoneNumber;
private String _content;
private String _type; public Guest(String PhoneNumber,String Content,String type){
this._phoneNumber=PhoneNumber;
this._content=Content;
this._type=type;
}
//下单
public void PlaceOrder(){
System.out.println("网上下单:"+_content+"提醒方式:"_type);
new ShopOwner().doOrder(_phoneNumber, _content, _type,this);
}
//电话提醒方法
@Override
public void TelephoneReminderService(String PhoneNumber, String Content) {
System.out.println(PhoneNumber+":"+Content);
}
//短信提醒方法
@Override
public void MessageReminderService(String PhoneNumber, String Content) { }
//敲门提醒方法
@Override
public void KnockDoorReminderService(String Content) { }
}
3、平台服务端
package Service;
import Interface.TakeOutServiceInterface;
public class ShopOwner {
public void doOrder(String PhoneNumber,String Content,String Type,TakeOutServiceInterface hotelService){
System.out.println("店家处理订单,等待中。。。");
try {
Thread.currentThread().sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("外卖到达,提醒顾客。");
if(!Type.equals("")){
switch (Type){
case "电话":
hotelService.TelephoneReminderService(PhoneNumber,"喂,您好,您的外卖已送达请下来取一下。");
break;
case "短信":
hotelService.MessageReminderService(PhoneNumber,"您的外卖已送达请下来取一下。");
break;
case "敲门":
hotelService.KnockDoorReminderService("您好,您的外卖到了");
break;
}
}
}
}
4、测试
package Test; import Service.Guest;
public class TestCallBack {
public static void main(String[] args) {
String PhoneNumber="Not_Copy";
String Content="老板来一份黄焖鸡米饭。";
String Type="电话";
Guest guest = new Guest(PhoneNumber,Content,Type);
guest.PlaceOrder();
}
}
5、结果
网上下单:老板来一份黄焖鸡米饭。提醒方式:电话
店家处理订单,等待中。。。
外卖到达,提醒顾客。
Not_Copy:喂,您好,您的外卖已送达请下来取一下。
6、总结
在测试中 guest对象 只是调用了 下单PlaceOrder() 这一个方法,服务端就会根据接口类库的方法 回调到 guest对象的 电话提醒 TelephoneReminderService 的方法,前提是 这个方法在 回调接口 中注册了才行。
注:这里的 回调接口也可以用 抽象类来代替。
参考:https://www.cnblogs.com/liboBlog/p/7107440.html
Java 之 回调方法的更多相关文章
- Java回调方法详解
回调在维基百科中定义为: 在计算机程序设计中,回调函数,是指通过函数参数传递到其他代码的,某一块可执行代码的引用. 其目的是允许底层代码调用在高层定义的子程序. 举个例子可能更明白一些:以Androi ...
- 回调方法介绍之中国好室友篇(Java示例)
前言 在Java社区的各种开源工具中,回调方法的使用俯拾即是.所以熟悉回调方法无疑能加速自己对开源轮子的掌握.网上搜了一些文章,奈何对回调方法的介绍大多只停留在什么是回调方法的程度上.本篇文章尝试从回 ...
- java回调方法之理解
以前经常看见"回调方法(或回调函数)"一词,但是没有了解过是什么意思,更不知道用法.现在从网络上搜集了一些很好的资料,自己又整理一下,作为自己的笔记,也作为学习过程中的一个小脚印. ...
- java回调方法、钩子方法以及模板方法模式
在面向对象的语言中,回调则是通过接口或抽象类来实现的,我们把实现这种接口的类称为回调类,回调类的对象称为回调对象,其处理事件的方法叫做回调方法.(摘自百度百科) 那么通过上面那句话将百度百科中的&qu ...
- Java回调方法的设计思路
package com.test; /** * 回调方法的设计技巧,例如hibernate的getHibernateTemplate().execute(Handler h)方法 */ public ...
- Java:回调机制
引用:http://blog.sina.com.cn/s/blog_48cf38890100go6x.html 1. 什么是回调函数 回调函数(callback Function),顾名思义, ...
- 16)JAVA实现回调(Android,Swing中各类listener的实现)
熟悉MS-Windows和X Windows事件驱动设计模式的开发人员,通常是把一个方法的指针传递给事件源,当某一事件发生时来调用这个方法(也称为"回调").Java ...
- 探究Activity的各回调方法
刚毕业那会儿,一心想朝着java web的方向进军,却岂料实习的时候阴差阳错地踏入了Android的大门,自此人生跌宕起伏.坎坎坷坷,在一家外企参与了几个需要越过GFW才能使用的有关于体育赛事的项目, ...
- react-native WebView 返回处理 (非回调方法可解决)
1.前言 项目中有些页面内容是变更比较频繁的,这些页面我们会考虑用网页来解决. 在RN项目中提供一个公用的Web页,如果是网页内容,就跳转到这个界面展示. 此时会有一个问题是,网页会有一级页面,二级页 ...
随机推荐
- 115-基于TI TMS320DM6467无操作系统Camera Link智能图像分析平台
基于TI TMS320DM6467无操作系统Camera Link智能图像分析平台 1.板卡概述 该板卡是我公司推出的一款具有高可靠性.效率大化.无操作系统的智能视频处理卡,是机器视觉开发上的选. ...
- STM32F407 正点原子按键输入实验
库函数版本: 库函数 源文件 头文件 GPIO_Init(GPIOE, &GPIOE_initstructure) stm32f4xx_gpio.c stm32f4xx_gpio.h RCC_ ...
- diff 比较两个文件的不同
1.命令功能 diff 逐行比较文件内容,并输出文件差异. 2.语法格式 diff option file1 file2 diff 选项 文件1 文件2 参数说明 参数 参数说明 ...
- Codeforces 938 正方形方格最多0/1 足球赛dijkstra建图
A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...
- vecto容器中一些没有注意到的地方
vector容器 vectoor是一个单口容器. vector动态增长的基本原理 当插入新元素的时候,如果空间不足,那么vector会重新申请更大的一块内存空间,将原空间数据拷贝到新空间,释放旧空间的 ...
- bzoj2959: 长跑 LCT+并查集+边双联通
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2959 题解 调了半天,终于调完了. 显然题目要求是求出目前从 \(A\) 到 \(B\) 的可 ...
- Zookeeper学习笔记(上)
Zookeeper学习笔记 本篇主要是一些基本的介绍和API的使用介绍, 有些只是记录了知识点,而没有完全在笔记中详细解释, 需要自行查找资料补充相关概念 主要参考了课程中的内容: Zookeeper ...
- windows 10安装python3和python2
安装包下载: 安装包下载请点我 下载完安装包就可以开始安装了,下面是流程图! Python3.6安装流程: 选择自定义安装: 直接next 为电脑上的所有用户安装 然后install就ok了! 安装完 ...
- NOIP2017 D2T1 奶酪
洛谷P3958 超级水的并没有用什么几何知识的几何题…… 直接爆搜一遍最后判断有没有与上/下表面相连的球之间连通即可……O(n2)不动脑子的复杂度 最多只是用一下并查集来判断两个点是否连通…… 具体细 ...
- [CF1004E] Sonya and Ice-cream
问题描述 Sonya likes ice cream very much. She eats it even during programming competitions. That is why ...