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页,如果是网页内容,就跳转到这个界面展示. 此时会有一个问题是,网页会有一级页面,二级页 ...
随机推荐
- Linux架构之Nginx 高可用
第53章 Nginx之高可用Keepalived 一.Keepalived高可用基本概述 1.1)什么是高可用 一般是指2台机器启动着完全相同的业务系统,当有一台机器down机了,另外一台服务器就能快 ...
- Linux之bash的变量
1. 变量的显示,echo echo $变量 或 echo ${变量} eg. echo $HOME 或 echo ${HOME} 2. 变量的设置 变量的设置规则: (1)变量与变 ...
- Codeforces 961 容斥叉积判共线 树状数组递增思想题
A B C D 给你N个点 问你能不能有两条直线穿过这N个点 首先假设这N个点是可以被两条直线穿过的 所以两条直线就把这N个点划分成两个集合 我们取1 2 3三个点这样必定会有两个点在一个集合内 ch ...
- flask-migrate的使用
先安装flask-migrate:pip install flask-migrate 然后见代码: 输入命令生成migrates文件夹 然后可以看到项目下生成文件夹: 然后输入命令: 看到: 总之,模 ...
- 29.密码学知识-消息认证码MAC-6——2019年12月19日
1. 消息认证码 1.1 消息认证 消息认证码(message authentication code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为MAC. 思考改进方案? 从哈希函数 ...
- 【GDOI2014模拟】服务器
前言 直到比赛最后几分钟,才发现60%数据居然是一个水dp,结果没打完. 题目 我们需要将一个文件复制到n个服务器上,这些服务器的编号为S1, S2, -, Sn. 首先,我们可以选择一些服务器,直接 ...
- C#知识点:委托、事件、正则表达式、SVN、找按段等差递增至不变序列的规律
using System; using System.Collections.Generic; using System.Text; namespace Delegate { //定义委托,它定义了可 ...
- js-进度条-动画
效果图如下: HTML: <h1>js实现进度条</h1> <div id="warp"> <div id="inn ...
- PHP文件的上传和下载
1.使用PHP的创始人 Rasmus Lerdorf 写的APC扩展模块来实现(http://pecl.php.net/package/apc) APC实现方法: 安装APC,参照官方文档安装,可以使 ...
- HDU 2296 Ring ( Trie图 && DP && DP状态记录)
题意 : 给出 m 个单词,每一个单词有一个权重,如果一个字符串包含了这些单词,那么意味着这个字符串拥有了其权重,问你构成长度为 n 且权重最大的字符串是什么 ( 若有权重相同的,则输出最短且字典序最 ...