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