最近在看Spring的JdbcTemplate,有碰到不少的回調場景,在這裏作一個筆記。java
示例:ide
公司的經理出差時打電話給你讓你幫他處理件事情,但不能一直通着電話,因而他讓你辦好事情後打電話告訴他一聲。測試
如今用代碼的方式來實現一個這個過程,看一下這個過程到底是怎樣的。this
新建一個Java項目:CallBackDemoInJava;spa
而後再新建三個類:Manager(該類用來模擬總經理)、Personnel(該類用來模擬員工)、Main(主類);.net
Manager:code
public class Manager { /** * @param personnel * 傳入一個員工類的對象 */ public Manager(Personnel personnel) { // 想讓該讓員工作什麼 personnel.doSomething(this, "整理公司文件"); } /** * @description 當員工作完總經理讓他作的過後就經過該方法通知總經理 * @param result * 事情結果 */ public void phoneCall(String result) { System.out.println("事情" + result); } }
Manager類是個模擬總經理的類,當該類的對象被造出來後就會經過Personnel的對象去執行Personnel中的doSomething方法告訴員工作些什麼對象
Personnel(員工):blog
public class Personnel { public void doSomething(Manager manager, String task) { // 總經理經過doSomething方法告訴員工要作什麼 System.out.println("總經理要你作" + task); String result = "作完了"; // 當事情作完了咱們就經過總經理公佈的phoneCall方法通知總經理結果 manager.phoneCall(result); } }
總經理經過調用Personnel中的doSomething方法告訴員工該作些什麼,當員工作完後就經過Manager中的phoneCall方法通知總經理結果接口
咱們在Main中測試運行下代碼看看結果:
public class Main { public static void main(String[] args) { // 首先咱們須要一個員工 Personnel personnel = new Personnel(); // 其次把這個員工指派給總經理 new Manager(personnel); } }
代碼執行結果以下:
回到咱們剛纔舉的那個現實中的例子:總經理出差前要你去辦件事情,這件事情經過doSomething告訴你了,事情要是辦完了就打總經理的電話phoneCall通知他一聲。這裏的phoneCall咱們就稱爲回調方法,數據的流向大體是Manager—–>Personnel—–>Manager,這不就是一個「回調」的過程麼?
如今總結下知足回調的兩個基本條件:
1.Class A調用Class B中的X方法
2.ClassB中X方法執行的過程當中調用Class A中的Y方法完成回調
一切看上去都很完美~以上例子代碼簡單通俗地描述了回調,可是這裏我就會有這樣一個疑問:假設總經理出差前交了件事情給我去辦,不巧……副總經理也要給我件事去辦,更無恥的是……主管也發任務過來了,都要求說作完就打電話通知他們……這時咱們就要定義更多類,什麼總經理類啦~經理類啦~主管類啦~雜七雜八的類,可是這些雜七雜八的大爺們都要求作完事情就電話通知,每一個類都會有一個相似phoneCall的方法做爲回調方法,這時,咱們利用面向對象的思想來看~是否是能夠把這個回調方法抽象出來做爲一個獨立的抽象類或接口呢?多態的思想油然而生~~~鑑於JAVA接口的好處,咱們就定義一個名爲CallBack的接口做爲回調接口,再在該接口下定義一個名爲backResult的抽象方法做爲回調方法,讓那些總經理類啦~經理類啦~主管類啦~什麼的都去實現該接口,這時候咱們就來改造下咱們的項目:
CallBack代碼以下:
/** * @description 該類用來模擬總經理 */ public class Manager implements CallBack { /** * @param personnel * 傳入一個員工類的對象 */ public Manager(Personnel personnel) { // 想讓該讓員工作什麼 personnel.doSomething(this, "整理公司文件"); } /** * @description 當員工作完總經理讓他作的過後就經過該方法通知總經理 * @param result * 事情結果 */ public void backResult(String result) { System.out.println("事情" + result); } }
Personnel代碼改造後以下:
doSomething方法再也不傳入一個Manager對象而是一個CallBack接口:
/** * @description 該類用來模擬員工 */ public class Personnel { public void doSomething(CallBack callBack, String task) { // 總經理經過doSomething方法告訴員工要作什麼 System.out.println("總經理要你作" + task); String result = "作完了"; // 當事情作完了咱們就經過總經理公佈的phoneCall方法通知總經理結果 callBack.backResult(result); } }
Main代碼不變,執行結果也是同樣的。