淺析回調

淺析回調

我們經常聽說回調函數,其實對於學習面向對象編程的人可能會對回調函數不是太清楚.
但是其實java圖形編程已經有這個概念了,其實就是事件監聽.

舉例

某天我打電話向你請教問題,你一時想不出解決方法,我又不能拿着電話在那裏傻等.
於是我們約定:等你想出辦法後打手機通知我,這樣我就掛掉電話辦其它事情去了.
過了XX分鐘,我的手機響了,你興高采烈的說問題已經搞定,應該如此這般處理.

這個例子說明了“異步+回調”的編程模式.其中,你後來打手機告訴我結果便是一個“回調”過程.
我的手機號碼必須在以前告訴你,這便是註冊回調函數;我的手機號碼應該有效並且手機能夠接收到你的呼叫,這是回調函數必須符合接口規範.
通過上面個人感覺到回調函數更多的應用就是結合異步。

往往和回調對應的是輪詢,就是我主動的去查看事件有沒有觸發,這種輪詢模式就比較低效.

Java Code

public class Student
{

    private String stuName;
    private Teacher teacher;

    public Student(String stuName, Teacher teacher)
    {
        this.stuName = stuName;
        this.teacher = teacher;
    }

    public String ask(Teacher teacher)
    {
        System.out.println("詢問老師...");
        return teacher.response(this);//註冊回調函數簽名this
    }

}

public class Teacher
{

    public String response(Student student)//註冊回調函數簽名this
    // 這個入參就像是學生留個老師一個電話號碼,等老師想到解決辦法之後可以回撥給學生.
    {
    try
    {
        System.out.println("等待過程");
        Thread.sleep(5000);
        // 這裏的觸發事件比較簡單就直接是休眠5秒
    } catch (InterruptedException e)
    {
        e.printStackTrace();
    }
    return student.getStuName() + ":this is answer xxx";
    }

}

public class MainApp
{

    public static void main(String[] args) throws Exception
    {

    Teacher teacher = new Teacher();
    Student student = new Student("zhangsan", teacher);
    String result = student.ask(teacher);
    System.out.println(result);

    }

}

總結

異步回調的核心在於避免輪詢註冊回調函數,基於事件觸發.

參考

1、http://lavasoft.blog.51cto.com/62575/90453/
2、https://www.zhihu.com/question/19801131

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章