Java 之 回调方法
2024-10-07 09:51:50
打个比方,我们点外卖都有到达提醒的服务,顾客自己选择提醒的方式。可以是电话提醒、短信提醒、也可以敲门提醒,这里,“提醒”这个行为是美团或饿了么这样的平台提供的,相当于库函数,但是提醒的方式是由顾客决定并告诉平台的,也就是回调函数。而顾客告诉平台怎么提醒自己的动作,也就是把回调函数传入库函数的动作,称为登记回调函数(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
最新文章
- Vim中split的使用方法
- 阻止默认行为stopDefault
- WPF异步载入图片,附带载入中动画
- Nyoj 城市平乱(图论)
- 性能测试分享: Jmeter的源码分析main函数参数
- 云计算之路-阿里云上:RDS数据库连接数过万引发故障,主备库切换后恢复正常
- json和xml封装数据、数据缓存到文件中
- MyRapid WinForm 快速开发框架
- go语言调度器源代码情景分析之三:内存
- React中this.props的主要属性
- Nginx记录-nginx 负载均衡5种配置方式(转载)
- CSS3知识!
- 【BZOJ2000】[HNOI2000]取石头游戏(贪心,博弈论)
- curl 用法总结
- 使用百度网盘配置私有Git服务
- 分享到xxx
- Android SDK更新失败对策
- 【Linux】- ps -ef |grep 命令
- 一卡通大冒险(hdu 2512)
- 【luogu P2065 [TJOI2011]卡片】 假题解
热门文章
- Qt项目中main主函数及其作用
- 连接数据库出现错误:1045-Access denied for user 'root'@'localhost'解决方法
- 一、ASP.NET Iframework_SignalR集线器类(v2)
- C#设置欢迎窗体由不透明变透明
- DDD领域驱动设计初探(三):仓储Repository(下)
- 「版本升级」界面控件Kendo UI正式发布R2 2019|附下载
- LeetCode--022--括号生成(python)
- wepy 中文乱码
- Java——基础简介
- C++11 lambda表达式小结