Java中的回調函數


  • 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM