1. 程式人生 > >回撥(callback)機制

回撥(callback)機制

一. 前言

        回撥(callBack)是使用頻率非常高的一種程式設計技巧,它是2個物件間通訊的一個手段.曾經看到知乎上一個比較淺顯易懂的說法:

        你到一個商店買東西,剛好你要的東西沒有貨,於是你在店員那裡留下了你的電話,過了幾天店裡有貨了,店員就打了你的電話,然後你接到電話後就到店裡去取了貨。在這個例子裡,你的電話號碼就叫回調函式,你把電話留給店員就叫登記回撥函式,店裡後來有貨了叫做觸發了回撥關聯的事件,店員給你打電話叫做呼叫回撥函式,你到店裡去取貨叫做響應回撥事件。回答完畢。 (連結:https://www.zhihu.com/question/19801131)

二. 分析問題

        現在寫個小程式來實踐下.分析下這個問題,可以看到:
        物件:PersonA(店員), PersonB(我)
        分別擁有啥和幹了啥: PersonB(我): 有一個作為回撥函式的號碼,一個註冊函式.
                                 PersonA(店員):  等待貨物的到來,貨物來了回調回調函式.

三. 解決問題

        這裡我們用,回撥介面來實現回撥函式,以它來作為二者的橋樑。用java語言,在android studio 上實現,首先寫一個介面類CallBack.java,其內容為:
package com.example.test
;public interface CallBack { void onCallBack(); }

        然後,我們實現PersonB.java類.其主要任務為2個,其一,定義和new一個回撥函式物件,其二,把這個物件註冊到PersonA當中去.
package com.example.test;public class PersonB {
private String name;
  public MCallBack mCallBack;
private boolean haveGoods = true;
public PersonB(String str){
name = str;
mCallBack = new MCallBack(); }public class MCallBack implements CallBack{ @Override public void onCallBack() { System.out.println("PersonA: PersonB,Your goods has arrived! "); } }public void testCallBack(){ System.out.println("PersonB: PersonA, Call me if you have goods!"); new PersonA("PersonA").notifyIfGoodsArrived(haveGoods,mCallBack); } }


        接下來實現PersonA.java為,其主要任務也為2個,其一為完成PersonB交代的任務(這裡開啟一個執行緒睡3s來模擬這個任務), 其二,完成任務後,通過收到的回撥介面(來之PersonB)通知PersonB:
package com.example.test;public class PersonA {
public String name;
public PersonA(String str){
name = str;
    }
public void notifyIfGoodsArrived(final boolean haveGoods, final CallBack mCallBack){
if (haveGoods){
//start the task to wait for the goods.
new Thread(){
@Override
public void run() {
try{
//Suppose the goods come after 3 seconds.
sleep(3000);
                    } catch(InterruptedException e){
e.printStackTrace();
                    }
mCallBack.onCallBack();
                }
            }.start();        }
    }
}

        最後編寫一個測試類MyClass.java
package com.example.test;public class myClass {
public static void main(String[] args){
new PersonB("PersonB").testCallBack();
    }
}

        測試結果:
PersonB: PersonA, Call me if you have goods!
PersonA: PersonB,Your goods has arrived!
Process finished with exit code 0

四. 結論

        結果基本的實現了我們的目標, 注意不要用PersonB 來implement CallBack, 因為傳一個介面把自己完全暴露給PersonA, 隱私都沒了.這樣可能會導致資料不安全.