- 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完成回調
package lao.na.callback.asyn.callback; /** * <p> * Description: 回調接口 * </p> * * @author laona * * @Date 2017年12月20日 上午10:25:14 * * @Email mengzhanqi@caihang.com */ public interface CallBack { public void execute(String result); }
package lao.na.callback.asyn.entity; import lao.na.callback.asyn.callback.CallBack; /** * <p> * Description: 員工 * </p> * * @author laona * * @Date 2017年12月20日 上午10:22:37 * */ public class Employee { // 員工含有接收老板引用的方法 public void doWork(CallBack callBack, String work) { try { // 員工睡了10秒 Thread.sleep(10000l); // 告訴老板說工作完成了 callBack.execute("老板讓我" + work + "老板,我的工作已經做完!!"); } catch (InterruptedException e) { e.printStackTrace(); } } }
package lao.na.callback.asyn.entity; import lao.na.callback.asyn.callback.CallBack; /** * <p> * Description: 老板 * </p> * * @author laona * * @Date 2017年12月20日 上午10:22:22 * */ public class Boss implements CallBack{ // 老板 持有 員工 對象 private Employee emp; public Boss(Employee emp) { this.emp = emp; } public void doWork(final String work) { new Thread(new Runnable() { @Override public void run() { // 想員工方法中注入具體回調對象 emp.doWork(Boss.this, work); } }).start(); // 老板去玩了... this.play(); } private void play() { System.out.println("老板去玩了..."); } /** * 回調函數 */ @Override public void execute(String result) { System.out.println(result); } }
package lao.na.callback.asyn.client; import lao.na.callback.asyn.entity.Boss; import lao.na.callback.asyn.entity.Employee; /** <p>Description: 異步回調函數測試</p> * * @author laona * * @Date 2017年12月20日 上午10:20:58 * */ public class AsynClient { public static void main(String[] args) { // Boss持有emp Boss boss = new Boss(new Employee()); // boss讓emp去工作 然后向boss報告 boss.doWork("去工作..."); } }
同步回調函數:
角色 : 老板Boss 員工Employee 回調接口 CallBack Boss實現CallBack接口
場景: 員工去工作,工作完成之后向老板匯報,員工工作完成去玩了
解決方案 : 員工持有老板引用(即CallBack接口),員工工作完成,調CallBack接口完成回到
package lao.na.callback.syn.callback; /** * <p> * Description: 老板引用 * </p> * * @author laona * * @Date 2017年12月20日 上午11:00:21 * */ public interface CallBack { // 老板引用 public void execute(String result); }
package lao.na.callback.syn.entity; import lao.na.callback.syn.callback.CallBack; /** * <p> * Description: 員工 * </p> * * @author laona * * @Date 2017年12月20日 上午11:02:57 * */ public class Employee { // 員工持有老板引用 private CallBack callBack; public void setCallBack(CallBack callBack) { this.callBack = callBack; } public void doWork(String work) { System.out.println("emp 工作是: " + work); String result = "工作已完成!!!"; callBack.execute(result); this.play(); } private void play() { System.out.println("工作匯報完畢,員工去玩了..."); } }
package lao.na.callback.syn.entity; import lao.na.callback.syn.callback.CallBack; /** * <p> * Description: 老板 * </p> * * @author laona * * @Date 2017年12月20日 上午11:01:44 * */ public class Boss implements CallBack { @Override public void execute(String result) { System.out.println("老板收到結果是 : " + result); } }
package lao.na.callback.syn.client; import lao.na.callback.syn.entity.Boss; import lao.na.callback.syn.entity.Employee; /** * <p> * Description: 同步回調函數測試 * </p> * * @author laona * * @Date 2017年12月20日 上午10:59:42 * */ public class synClient { public static void main(String[] args) { Employee emp = new Employee(); emp.setCallBack(new Boss()); emp.doWork("去打印文件"); } }
我們在使用Struts時,當我們編寫Action時,就需要繼承Action類,然后實現execute()方法,在execute()方法中寫咱們自己的業務邏輯代碼,
完成對用戶請求的處理。 由此可以猜測,框架和容器中會提供大量的回調接口,以滿足個性化的定制。
-- laona 2017-12-20
