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页,如果是网页内容,就跳转到这个界面展示. 此时会有一个问题是,网页会有一级页面,二级页 ...
 
随机推荐
- SPSS 23下载安装和激活
			
目录 1. 其他版本 2. 安装教程 3. 下载地址 1. 其他版本 参考:https://www.cnblogs.com/coco56/p/11648399.html 2. 安装教程 SPSS 23 ...
 - 分分钟轻松搞定IBM系列 RAID5搭建
			
分分钟轻松搞定IBM系列 RAID5搭建 按照 以下图片步骤一步步可轻松完成IBM服务器RAID1.5.10等的搭建. 此例是以RAID5为例,RAID1和10可举一反三.
 - intel RDT技术管理cache和memory_bandwidth
			
主页:https://www.intel.com/content/www/us/en/architecture-and-technology/resource-director-technology. ...
 - rsync服务实践
			
RSYNC数据备份 RSYNC=Remote Sync 远程同步 高效,一定要结合shell 官方网站:https://rsync.samba.org/ Author: Andrew Tr ...
 - LeetCode--142--环形链表II(python)
			
给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 - ...
 - 51nod1820 长城之旅
			
题目描述 BB 痛失一血(打了场Comet OJ回来就没了) 不过后来又刷了一道水题 题解 LCM+取模=结论题 结论1 \(gcd(k^{2^i}+1,k^{2^j}+1)=1 (i\neq j 且 ...
 - OC项目调用C++
			
CPPHello.hpp #ifndef CPPHello_hpp #define CPPHello_hpp #include <stdio.h> class CPPHello { pub ...
 - (18)C++项目练习一(功能会不断扩展)--------【聊天工具】
			
1.准备使用Qt和C++做一个远程(基于互联网的)聊天工具,需要实现以下功能 (1)多对多聊天功能 (2)文件传输功能 (3)注册.登录功能 (4)加好友.同意好友功能 (5)好友列表.黑名单功能(分 ...
 - 冲刺周六 Fighting SaturDay
			
一.Saturday照片 二.项目分工 三.今日份燃尽图 四.项目进展 码云团队协同环境构建完毕 利用Leangoo制作任务分工及生成燃尽图 完成AES加解密部分代码 用代码实现对文件的新建.移动.复 ...
 - Django中间件添加白名单
			
一定记得配置 补充一点中间件是工作流程 中间件的详细流程 补充一点需求:在不用中间件的情况和下用装饰器做登陆的阻挡 在django中有自带的 登陆闭包函数只需要引出来就可以直接用了下面是步骤 在se ...