java基礎-回調函數(callback)

                          java基礎-回調函數(callback)java

                                            做者:尹正傑ide

版權聲明:原創做品,謝絕轉載!不然將追究法律責任。函數

 

 

  回調函數就是一個經過函數指針調用的函數。若是你把函數的指針(地址)做爲參數傳遞給另外一個函數,當這個指針被用來調用其所指向的函數時,咱們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。oop

  在C和C++中有回調函數數一個顯而易見的東西,可是在Java中它沒有這個機制,只能咱們手動實現。本篇博客就用Java實現一個簡單的回調函數案例。this

 

一.Java回調機制spa

  1>.Class A 實現接口 CallBack callback;
  2>.Class A 中包含一個lB的引用b;
  3>.Class B 有一個參數爲callback 的方法f(CallBack callback);
  4>.Class A的對象a調用Class B方法f(CallBack callback),換句話說,就是A類調用B類的某個方法c;
  5>.而後b就能夠在f(CallBack callback)方法中調用A的方法,換句話說就是B類調用A類的某個方法d;指針

 

二.案例展現code

1>.場景分析對象

  立刻快到週五了,小明想要跟他的女友一塊兒去看電影,如下是他們的通話記錄:blog

    小明說:[親愛的,週五有部電影要首映,我關注了很久,咱們一塊兒去看吧,從19:00~23:30均可以看,你啥時候下班呢?]

    小紅說:[啊~啊~好刺激呀,我在吃辣條呢,一會打給你]

    小明說:[那我先忙手上的工做了!]

    小紅說:[下班我回家換套衣服,要不晚上10:30不見不散!]

2>.代碼實現

   CallBack.java 代碼以下:

/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.hdfs;

public interface CallBack {
    /**
     * 這是小紅知道答案時要調用的函數告訴小明,也就是回調函數,這個接口我是能夠自定義喲。
     */
    public abstract  void  resolv(String result);
}

  XiaoMing.java 文件內容以下:

/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.hdfs;

/**
 *  這是小明
 *      實現了一個回調接口CallBack。
 */
public class XiaoMing implements CallBack {
    /**
     * 建立一個對小紅對象的引用
     */
    private XiaoHong xiaohong;
    /**
     * 小明的構造方法,持有對Xiaohong的引用
     */
    public XiaoMing(XiaoHong xiaohong) {
        this.xiaohong = xiaohong;
    }

    public XiaoMing() {

    }

    /**
     * 小明經過這個方法去問小紅問題
     */
    public void askQuestion(final String question) throws InterruptedException {
        Thread ask = new Thread() {
            @Override
            public void run() {
                try {
                    xiaohong.execute(XiaoMing.this, question);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        };
        ask.start();
//        ask.join();
        //小明問完問題掛掉電話就去忙工做上的事情了
        work();
    }

    public void work(){
        String work = "小明說:[那我先忙手上的工做了!]";
        System.out.println(work);
    }

    /**
     * 這是小紅肯定了看電影的具體時間,調用此方法告訴小明,就是所謂的小明的回調方法。
     */
    public void resolv(String result) {
        System.out.printf("小紅說:[%s]\n",result);
    }
}

  XiaoHong.java 文件內容以下:

/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.hdfs;

/**
 * 這個就是小紅
 */
public class XiaoHong {
    /**
     *小明問的問題
     */
    public void execute(CallBack callBack ,String question) throws InterruptedException {
        System.out.println(question);
        //模擬小紅辦本身的事情須要很長時間
        System.out.println("小紅說:[啊~啊~好刺激呀,我在吃辣條呢,一會打給你]");
        Thread.sleep(10000);
        //小紅辦完本身的事情以後就想到了答案是「晚上加班,去不了啦,下次吧!」
        String result = "下班我回家換套衣服,要不晚上10:30不見不散!";
        /**
         * 因而就打電話告訴小明,調用小明中的方法。
         */
        callBack.resolv(result);
    }
}

  Demo.java 文件內容以下:

/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.hdfs;

public class Demo {
    public static void main(String[] args) throws InterruptedException {
        XiaoHong xiaoHong = new XiaoHong();
        XiaoMing xiaoMing = new XiaoMing(xiaoHong);

        String question = "小明說:[親愛的,週五有部電影要首映,我關注了很久,咱們一塊兒去看吧,從19:00~23:30均可以看,你啥時候下班呢?]";
        xiaoMing.askQuestion(question);
    }
}

 3>.小結

xiaoMing調用xiaoHong的execute方法,xiaoHong在execute方法中經過CallBack接口調用xiaoMing的resolve。

相關文章
相關標籤/搜索