Class A实现接口CallBack callback——背景1
class A中包含一个class B的引用b ——背景2
class B有一个参数为callback的方法f(CallBack callback) ——背景3
A的对象a调用B的方法 f(CallBack callback) ——A类调用B类的某个方法 C
然后b就可以在f(CallBack callback)方法中调用A的方法 ——B类调用A类的某个方法D
熟知的打电话的例子采用异步加回调
有一天小王遇到一个很难的问题,问题是“1 + 1 = ?”,就打电话问小李,小李一下子也不知道,
就跟小王说,等我办完手上的事情,就去想想答案,小王也不会傻傻的拿着电话去等小李的答案吧,
于是小王就对小李说,我还要去逛街,你知道了答案就打我电话告诉我,于是挂了电话,
自己办自己的事情,过了一个小时,小李打了小王的电话,告诉他答案是2
异步回调函数:
角色 : 老板Boss 员工Employee 回调接口 CallBack Boss实现CallBack接口
场景 : 老板雇员工,老板让员工去工作,老板去玩了,员工去工作,员工工作完成向老板汇报
解决方案: 老板持有员工对象,老板让员工去工作时传入Boss的引用,即调用CallBack接口,员工使用CallBack完成回调
packagelao.na.callback.asyn.callback;/***
* Description: 回调接口
*
*
*@authorlaona
*
* @Date 2017年12月20日 上午10:25:14
*
* @Email mengzhanqi@caihang.com*/
public interfaceCallBack {public voidexecute(String result);
}
packagelao.na.callback.asyn.entity;importlao.na.callback.asyn.callback.CallBack;/***
* Description: 员工
*
*
*@authorlaona
*
* @Date 2017年12月20日 上午10:22:37
**/
public classEmployee {//员工含有接收老板引用的方法
public voiddoWork(CallBack callBack, String work) {try{//员工睡了10秒
Thread.sleep(10000l);//告诉老板说工作完成了
callBack.execute("老板让我" + work + "老板,我的工作已经做完!!");
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
packagelao.na.callback.asyn.entity;importlao.na.callback.asyn.callback.CallBack;/***
* Description: 老板
*
*
*@authorlaona
*
* @Date 2017年12月20日 上午10:22:22
**/
public class Boss implementsCallBack{//老板 持有 员工 对象
privateEmployee emp;publicBoss(Employee emp) {this.emp =emp;
}public void doWork(finalString work) {new Thread(newRunnable() {
@Overridepublic voidrun() {//想员工方法中注入具体回调对象
emp.doWork(Boss.this, work);
}
}).start();//老板去玩了...
this.play();
}private voidplay() {
System.out.println("老板去玩了...");
}/*** 回调函数*/@Overridepublic voidexecute(String result) {
System.out.println(result);
}
}
packagelao.na.callback.asyn.client;importlao.na.callback.asyn.entity.Boss;importlao.na.callback.asyn.entity.Employee;/**
Description: 异步回调函数测试
*
*@authorlaona
*
* @Date 2017年12月20日 上午10:20:58
**/
public classAsynClient {public static voidmain(String[] args) {//Boss持有emp
Boss boss = new Boss(newEmployee());//boss让emp去工作 然后向boss报告
boss.doWork("去工作...");
}
}
同步回调函数:
角色 : 老板Boss 员工Employee 回调接口 CallBack Boss实现CallBack接口
场景: 员工去工作,工作完成之后向老板汇报,员工工作完成去玩了
解决方案 : 员工持有老板引用(即CallBack接口),员工工作完成,调CallBack接口完成回到
packagelao.na.callback.syn.callback;/***
* Description: 老板引用
*
*
*@authorlaona
*
* @Date 2017年12月20日 上午11:00:21
**/
public interfaceCallBack {//老板引用
public voidexecute(String result);
}
packagelao.na.callback.syn.entity;importlao.na.callback.syn.callback.CallBack;/***
* Description: 员工
*
*
*@authorlaona
*
* @Date 2017年12月20日 上午11:02:57
**/
public classEmployee {//员工持有老板引用
privateCallBack callBack;public voidsetCallBack(CallBack callBack) {this.callBack =callBack;
}public voiddoWork(String work) {
System.out.println("emp 工作是: " +work);
String result= "工作已完成!!!";
callBack.execute(result);this.play();
}private voidplay() {
System.out.println("工作汇报完毕,员工去玩了...");
}
}
packagelao.na.callback.syn.entity;importlao.na.callback.syn.callback.CallBack;/***
* Description: 老板
*
*
*@authorlaona
*
* @Date 2017年12月20日 上午11:01:44
**/
public class Boss implementsCallBack {
@Overridepublic voidexecute(String result) {
System.out.println("老板收到结果是 : " +result);
}
}
packagelao.na.callback.syn.client;importlao.na.callback.syn.entity.Boss;importlao.na.callback.syn.entity.Employee;/***
* Description: 同步回调函数测试
*
*
*@authorlaona
*
* @Date 2017年12月20日 上午10:59:42
**/
public classsynClient {public static voidmain(String[] args) {
Employee emp= newEmployee();
emp.setCallBack(newBoss());
emp.doWork("去打印文件");
}
}
我们在使用Struts时,当我们编写Action时,就需要继承Action类,然后实现execute()方法,在execute()方法中写咱们自己的业务逻辑代码,
完成对用户请求的处理。 由此可以猜测,框架和容器中会提供大量的回调接口,以满足个性化的定制。
-- laona 2017-12-20