打个比方,我们点外卖都有到达提醒的服务,顾客自己选择提醒的方式。可以是电话提醒、短信提醒、也可以敲门提醒,这里,“提醒”这个行为是美团或饿了么这样的平台提供的,相当于库函数,但是提醒的方式是由顾客决定并告诉平台的,也就是回调函数。而顾客告诉平台怎么提醒自己的动作,也就是把回调函数传入库函数的动作,称为登记回调函数(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

最新文章

  1. Vim中split的使用方法
  2. 阻止默认行为stopDefault
  3. WPF异步载入图片,附带载入中动画
  4. Nyoj 城市平乱(图论)
  5. 性能测试分享: Jmeter的源码分析main函数参数
  6. 云计算之路-阿里云上:RDS数据库连接数过万引发故障,主备库切换后恢复正常
  7. json和xml封装数据、数据缓存到文件中
  8. MyRapid WinForm 快速开发框架
  9. go语言调度器源代码情景分析之三:内存
  10. React中this.props的主要属性
  11. Nginx记录-nginx 负载均衡5种配置方式(转载)
  12. CSS3知识!
  13. 【BZOJ2000】[HNOI2000]取石头游戏(贪心,博弈论)
  14. curl 用法总结
  15. 使用百度网盘配置私有Git服务
  16. 分享到xxx
  17. Android SDK更新失败对策
  18. 【Linux】- ps -ef |grep 命令
  19. 一卡通大冒险(hdu 2512)
  20. 【luogu P2065 [TJOI2011]卡片】 假题解

热门文章

  1. Qt项目中main主函数及其作用
  2. 连接数据库出现错误:1045-Access denied for user 'root'@'localhost'解决方法
  3. 一、ASP.NET Iframework_SignalR集线器类(v2)
  4. C#设置欢迎窗体由不透明变透明
  5. DDD领域驱动设计初探(三):仓储Repository(下)
  6. 「版本升级」界面控件Kendo UI正式发布R2 2019|附下载
  7. LeetCode--022--括号生成(python)
  8. wepy 中文乱码
  9. Java——基础简介
  10. C++11 lambda表达式小结