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

  1. Java回调方法详解

    回调在维基百科中定义为: 在计算机程序设计中,回调函数,是指通过函数参数传递到其他代码的,某一块可执行代码的引用. 其目的是允许底层代码调用在高层定义的子程序. 举个例子可能更明白一些:以Androi ...

  2. 回调方法介绍之中国好室友篇(Java示例)

    前言 在Java社区的各种开源工具中,回调方法的使用俯拾即是.所以熟悉回调方法无疑能加速自己对开源轮子的掌握.网上搜了一些文章,奈何对回调方法的介绍大多只停留在什么是回调方法的程度上.本篇文章尝试从回 ...

  3. java回调方法之理解

    以前经常看见"回调方法(或回调函数)"一词,但是没有了解过是什么意思,更不知道用法.现在从网络上搜集了一些很好的资料,自己又整理一下,作为自己的笔记,也作为学习过程中的一个小脚印. ...

  4. java回调方法、钩子方法以及模板方法模式

    在面向对象的语言中,回调则是通过接口或抽象类来实现的,我们把实现这种接口的类称为回调类,回调类的对象称为回调对象,其处理事件的方法叫做回调方法.(摘自百度百科) 那么通过上面那句话将百度百科中的&qu ...

  5. Java回调方法的设计思路

    package com.test; /** * 回调方法的设计技巧,例如hibernate的getHibernateTemplate().execute(Handler h)方法 */ public ...

  6. Java:回调机制

    引用:http://blog.sina.com.cn/s/blog_48cf38890100go6x.html 1.  什么是回调函数    回调函数(callback Function),顾名思义, ...

  7. 16)JAVA实现回调(Android,Swing中各类listener的实现)

           熟悉MS-Windows和X Windows事件驱动设计模式的开发人员,通常是把一个方法的指针传递给事件源,当某一事件发生时来调用这个方法(也称为"回调").Java ...

  8. 探究Activity的各回调方法

    刚毕业那会儿,一心想朝着java web的方向进军,却岂料实习的时候阴差阳错地踏入了Android的大门,自此人生跌宕起伏.坎坎坷坷,在一家外企参与了几个需要越过GFW才能使用的有关于体育赛事的项目, ...

  9. react-native WebView 返回处理 (非回调方法可解决)

    1.前言 项目中有些页面内容是变更比较频繁的,这些页面我们会考虑用网页来解决. 在RN项目中提供一个公用的Web页,如果是网页内容,就跳转到这个界面展示. 此时会有一个问题是,网页会有一级页面,二级页 ...

随机推荐

  1. VB中preserve的用法

    注:本文转载自:http://zhidao.baidu.com/question/161401549.html ReDim 语句用来定义或重定义原来已经用带空圆括号(没有维数下标)的 Private. ...

  2. 【学习】019 SpringBoot

    一.SpringBoot介绍 1.1.SpringBoot简介 在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配 ...

  3. centos 安装代理服务 proxy server squild

    以下内容复制自https://blog.csdn.net/qingfengxulai/article/details/80853870 放置此处便于检索 1 安装 sudo yum install s ...

  4. mysql 在查字符串字段中 条件参数传为数字0查到与实际数据不匹配问题

    比如: CREATE TABLE `e` ( `id` int(11) DEFAULT NULL, `status` varchar(255) DEFAULT NULL, `b` varchar(25 ...

  5. linux shell 命令笔记

    标准输入.标准输出.标准错误 File descriptors are integers associated with an opened file or data stream. File des ...

  6. 组件通信 Provide&&inject

    在父组件中利用Provide 注入数据,在所有的子组件都可以拿到这个数据 可以在vue 中用来刷新页面 <!DOCTYPE html> <html lang="en&quo ...

  7. 数据库JDBC

    数据库概述 什么是数据库?数据库就是存储数据的仓库,本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以通过SQL对数据库进行增删改查操作. 数据库对应一个应用系统,在系统中有很多的功能,每 ...

  8. java web中乱码的种类和一些解决方式

    在java web课堂测试中遇到了一些乱码问题 ,从百度上找到了许多种解决方法和乱码的种类,在这里总结一下. 一.文件出现乱码 [右击文件]->[Properties]->[Resourc ...

  9. 【CF1236D】Alice and the Doll(set)

    题意:给定一个n*m的网格,其中k格有障碍 周驿东从(1,1)出发面朝右,每次行动前他可以选择顺时针旋转90度或不旋转,然后向自己朝向的位置走1格 问他能否不重复不遗漏的走过所有非障碍格 n,m,k& ...

  10. 在Ubuntu18.04下安装Java 11

    一直以来,本人都使用第三方软件包"ppa:linuxuprising/java"安装Java JDK,最近一次安装时发现无法成功.这是由于现在无法直接从Oracle官网下载Java ...