在學習Java的路上很早很早就接觸了回調,比如:JFrame的鍵盤事件,JFrame控件的點擊事件,線程池執行之前的方法beforeExecute與執行之後的方法 afterExecute,線程的Run方法其原理就是使用了回調。之前一直沒有研究過其原理,在這裏學習一下回調模式,也方便理解事件監聽模式和觀察者模式。
回調模式
在計算機程序設計中,回調函數,或簡稱回調,是指通過函數參數傳遞到其它代碼的,某一塊可執行代碼的引用。這一設計允許了底層代碼調用在高層定義的子程序
可能會有這樣一個需求,某開發者想在線程執行之後做一些事情,你可能想到的方法就是在線程的run方法體內做這些操作,這樣固然能實現,可是卻使得各種業務耦合在一起。最好的解決方法就是使用回調模式。
首先定義回調接口
public interface Callback {
void call();
}
定義一個抽象類ThreadHolder
,提供了兩個run
方法,一個可以傳遞迴調參數的方法,一個無參方法
abstract class ThreadHolder {
public final void run(Callback callback) {
run();
if (callback != null) {
callback.call();
}
}
public abstract void run();
}
然後實現一個簡單的線程任務,繼承ThreadHolder
並重寫run
方法
class SimpleThread extends ThreadHolder {
@Override
public void run() {
System.out.println("做一些事情。。。");
}
}
測試
public class CallBackTest {
public static void main(String[] args) {
Callback callback = () -> System.out.println("事情做完了,我要做其它事情了");
SimpleThread simpleThread = new SimpleThread();
simpleThread.run(callback);
}
}
測試結果:
做一些事情。。。
事情做完了,我要做其它事情了
通過這個實例,我們可以看到使用回調模式實現了我們的功能。在底層代碼,即ThreadHolder
中我們就制定了空方法執行順序,在高層重寫空的方法,然後在執行時我們實現的方法就會被底層調用。