像许多网上介绍回调机制的文章一样,我这里也以一个现实的例子开头:假设你公司的总经理出差前需要你帮他办件事情,这件事情你需要花些时间去做,这时候总经理肯定不能守着你做完再出差吧,
于是就他告诉你他的手机号码叫你如果事情办完了你就打电话告诉他一声;这是一个现实生活中常能碰到的例子,我们用呢就用代码的方式来实现一个这个过程,看一下这个过程究竟是怎样的。
首先在Eclipse中新建一个Java项目:CallBackDemoInJava;
然后再新建三个类:
1、Manager(该类用来模拟总经理)
2、Personnel(该类用来模拟员工)
3、Main(主类)

Manager的代码如下:

/**
* 该类用来模拟总经理
*/
public class Manager {
/**
* 传入一个员工类的对象
*/
public Manager(Personnel personnel) {
//想让该员工做什么
personnel.doSomething(this,"整理公司文件");
} /**
* 当员工做完总经理让他做的事情之后就通过该方法通知总经理
*/
public void phoneCall(String result) {
System.out.println("事情" + result);
}
}

Manager类是个模拟总经理的类,当该类的对象被造出来后就会通过Personnel的对象去执行Personnel中的doSomething方法告诉员工做些什么。

Personnel的代码如下:

/**
* 该类用来模拟员工
*/
public class Personnel {
public void doSomething(Manager manager, String task) {
//总经理通过doSomething方法告诉员工要干什么
System.out.println("总经理要你做" + task);
String result = "做完了";
//当事情做完了我们就通过总经理公布的phoneCall()方法通知总经理结果
manager.phoneCall(result);
} }

总经理通过调用Personnel中的doSomething方法告诉员工该做些什么,当员工做完后就通过Manager中的phoneCall方法通知总经理结果

那么好的!万事俱备,我们在Main中测试运行下代码看看结果:

public class Main {
public static void main(String[] args) {
//首先我们需要一个员工
Personnel personnel = new Personnel();
//把这个员工指派给经理
Manager manager = new Manager(personnel);
}
}
总经理要你做整理公司文件
事情做完了

回到我们刚才举的那个现实中的例子:总经理出差前要你去办件事情,这件事情通过doSomething告诉你了,事情要是办完了就打总经理的电话phoneCall通知他一声。这里的phoneCall我们就称为回调方法,为什么称之为回调呢?你问我我也不清楚哈~这你得问Sun公司了,不过我们从代码的执行过程可以看出数据的流向大致是Manager—–>Personnel—–>Manager,这不就是一个“回调”的过程么?现在我们来总结下满足回调的两个基本条件:
1.Class A调用Class B中的X方法
2.ClassB中X方法执行的过程中调用Class A中的Y方法完成回调
一切看上去都很完美~以上例子代码简单通俗地描述了回调,但是这里我就会有这样一个疑问:假设总经理出差前交了件事情给我去办,不巧……副总经理也要给我件事去办,更无耻的是……主管也发任务过来了,都要求说做完就打电话通知他们……这时我们就要定义更多类,什么总经理类啦~经理类啦~主管类啦~杂七杂八的类,但是这些杂七杂八的大爷们都要求做完事情就电话通知,每个类都会有一个类似phoneCall的方法作为回调方法,这时,我们利用面向对象的思想来看~是不是可以把这个回调方法抽象出来作为一个独立的抽象类或接口呢?多态的思想油然而生~~~鉴于JAVA接口的好处,我们就定义一个名为CallBack的接口作为回调接口,再在该接口下定义一个名为phoneCall的抽象方法作为回调方法,让那些总经理类啦~经理类啦~主管类啦~什么的都去实现该接口,这时候我们就来改造下我们的项目:

CallBack代码如下:

/**
* 回调接口
*/
public interface CallBack {
//回调方法
void phoneCall(String result);
}

Manager代码改造后如下:
实现CallBack接口重写phoneCall方法

public class Manager implements CallBack {
/**
* 传入一个员工类的对象
*/
public Manager(Personnel personnel) {
//想让该员工做什么
personnel.doSomething(this,"整理公司文件");
} /**
* 当员工做完总经理让他做的事情之后就通过该方法通知总经理
*/
public void phoneCall(String result) {
System.out.println("事情" + result);
}
}

Personnel代码改造后如下:
doSomething方法不再传入一个Manager对象而是一个CallBack接口:

public class Personnel {
public void doSomething(CallBack callBack, String task) {
//总经理通过doSomething方法告诉员工要干什么
System.out.println("总经理要你做" + task);
String result = "做完了";
//当事情做完了我们就通过总经理公布的phoneCall()方法通知总经理结果
callBack.phoneCall(result);
}
}

Main代码不变,执行结果也是一样的。

最新文章

  1. 和JavaScript家的闭包玩玩捉迷藏
  2. 使用javascript生成的植物显示过程特效
  3. android 使用jdbc1.3.0 操作 sql server
  4. SGU 422 Fast Typing(概率DP)
  5. android edittext 去边框
  6. 如何给Eclipse中添加库(jar包)
  7. js判断input为空校验
  8. Multi-Language IDE for Professional Developers (Komodo)
  9. bzoj2482
  10. 【分享】SQL Server优化50法
  11. 学习设计模式--观察者模式(C++)
  12. python 小白(无编程基础,无计算机基础)的开发之路 辅助知识1 with...as
  13. Ubuntu LTS 系统学习使用体会和实用工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04
  14. Harbor删除镜像后且GC清理后,磁盘空间没有释放的问题
  15. docker查看挂载目录Volume
  16. css之文本两端对齐
  17. 存根类(stub) 是什么意思?有什么作用?(转)
  18. fastdfs(https://www.jianshu.com/p/1c71ae024e5e)
  19. Linux查看DNS服务器及设置DNS服务器
  20. linux移植常见问题

热门文章

  1. BZOJ3809: Gty的二逼妹子序列
  2. 让IE下支持Html5的placeholder属性
  3. SQLi filter evasion cheat sheet (MySQL)
  4. 对于flat_interface与public_interface的理解
  5. 《GK101任意波发生器》升级固件发布(版本:1.0.2.build126)
  6. 【iM_VGA模块】运行 ucgui 演示!
  7. PAT天梯赛练习题 L3-002. 堆栈(线段树查询第K大值或主席树)
  8. Linux 执行ThinkPHP 文件的计划任务
  9. UITableview xib里面 cell 按钮的回调
  10. linux下创建和删除软、硬链接