回調是一種雙向調用模式,什麼意思呢,就是說,被調用方在被調用時也會調用對方,這就叫回調。“If you call me, i will call back”。
Java語言中經常會使用到回調機制,或許隻是平時沒有注意到吧。比如Android開發中的OnClickListener,當按鍵觸發的時候會執行使用者實作的回調方法,進而完成對按鍵的回報。再比如在使用SpringJDBC進行資料庫操作時候的某些方法,比如JdbcTemplate.update(sql, new PreparedStatementSetter()),這裡的PreparedStatementSetter()就是一個回調接口,使用者在其内部實作setValues()回調方法執行插入或者更新操作。
本文通過一個簡單的例子來對回調的實作及其機理做一個小記錄,以備未來檢視,也希望給讀者一些啟發,抛磚引玉。
回調模式其實是設計模式中的觀察者模式的一個精簡。使用者類實作回調接口,将接口的引用傳遞到一個使用者方法中。當調用使用者方法的時候,該使用者方法将會去調用接口方法的實作,這就是一個回調的基本過程。
如何實作?
首先定義一個回調接口ICallback,該接口内有一個回調方法定義Callback
這個回調接口接受兩個泛型參數T,E。T為使用者指定的傳回類型,E為使用者傳入的參數,在編譯時期進行驗證和擦除。
接着我們聲明使用者類,并在類内定義一個方法,傳入回調接口
這裡,我們模拟一個使用者注冊的場景。使用者服務實作類UserServiceImpl的注冊方法doRegister(final User user)接受從前台Controller傳來的組裝好的使用者對象,并将該對象通過Spring自動注入的UserDaoImpl使用者持久化類的doRegister(user)方法儲存到資料庫中。
execute(ICallback fun)方法調用回調接口的回調方法doCallback,傳入使用者持久化類userDaoImpl,傳回使用者指定的傳回值(該傳回值在具體的方法中指定)。比如在注冊方法doRegister中傳回值為Boolean。
當程式運作時,user對象傳入doRegister方法,調用execute方法,通過匿名内部類方式實作doCallback方法,調用UserDaoImpl的注冊方法實作使用者資料的持久化。
總結一下就是,使用者方法持有一個回調方法的引用,當調用該使用者方法時,會反過去調用回調接口中的回調方法,該方法的具體過程由使用者實作。這個過程稱為一次回調。