接口回调
原文鏈接:http://blog.csdn.net/aigestudio/article/details/40869893
廢話不多說,像許多網(wǎng)上介紹回調(diào)機制的文章一樣,我這里也以一個現(xiàn)實的例子開頭:假設(shè)你公司的總經(jīng)理出差前需要你幫他辦件事情,這件事情你需要花些時間去做,這時候總經(jīng)理肯定不能守著你做完再出差吧,于是就他告訴你他的手機號碼叫你如果事情辦完了你就打電話告訴他一聲;這是一個現(xiàn)實生活中常能碰到的例子,我們用呢就用代碼的方式來實現(xiàn)一個這個過程,看一下這個過程究竟是怎樣的。
首先在Eclipse中新建一個Java項目:CallBackDemoInJava
然后再新建三個類:Manager(該類用來模擬總經(jīng)理),Personnel(該類用來模擬員工),Main(主類)
Manager的代碼如下:
package com.aige.test; /** * @description 該類用來模擬總經(jīng)理 * @author Walid* @since 2014/11/6 */ public class Manager { /** * @param personnel 傳入一個員工類的對象 */ public Manager(Personnel personnel) { // 想讓該讓員工做什么 personnel.doSomething(this, "整理公司文件"); } /** * @description 當(dāng)員工做完總經(jīng)理讓他做的事后就通過該方法通知總經(jīng)理 * @param result 事情結(jié)果 */ public void phoneCall(String result) { System.out.println("事情" + result); } }Manager類是個模擬總經(jīng)理的類,當(dāng)該類的對象被造出來后就會通過Personnel的對象去執(zhí)行Personnel中的doSomething方法告訴員工做些什么
Personnel的代碼如下:
package com.aige.test; /** * @description 該類用來模擬員工 * @author Walid* @since 2014/11/6 */ public class Personnel { public void doSomething(Manager manager, String task) { // 總經(jīng)理通過doSomething方法告訴員工要做什么 System.out.println("總經(jīng)理要你做" + task); String result = "做完了"; // 當(dāng)事情做完了我們就通過總經(jīng)理公布的phoneCall方法通知總經(jīng)理結(jié)果 manager.phoneCall(result); } }總經(jīng)理通過調(diào)用Personnel中的doSomething方法告訴員工該做些什么,當(dāng)員工做完后就通過Manager中的phoneCall方法通知總經(jīng)理結(jié)果
那么好的!萬事俱備,我們在Main中測試運行下代碼看看結(jié)果:
package com.aige.test; public class Main { public static void main(String[] args) { // 首先我們需要一個員工 Personnel personnel = new Personnel(); // 其次把這個員工指派給總經(jīng)理 new Manager(personnel); } }代碼執(zhí)行結(jié)果如下:
回到我們剛才舉的那個現(xiàn)實中的例子:總經(jīng)理出差前要你去辦件事情,這件事情通過doSomething告訴你了,事情要是辦完了就打總經(jīng)理的電話phoneCall通知他一聲。這里的phoneCall我們就稱為回調(diào)方法,為什么稱之為回調(diào)呢?你問我我也不清楚哈~這你得問Sun公司了,不過我們從代碼的執(zhí)行過程可以看出數(shù)據(jù)的流向大致是Manager → Personnel → Manager,這不就是一個“回調(diào)”的過程么?現(xiàn)在我們來總結(jié)下滿足回調(diào)的兩個基本條件:
- Class A調(diào)用Class B中的X方法
- ClassB中X方法執(zhí)行的過程中調(diào)用Class A中的Y方法完成回調(diào)
一切看上去都很完美~以上例子代碼簡單通俗地描述了回調(diào),但是這里我就會有這樣一個疑問:假設(shè)總經(jīng)理出差前交了件事情給我去辦,不巧……副總經(jīng)理也要給我件事去辦,更無恥的是……主管也發(fā)任務(wù)過來了,都要求說做完就打電話通知他們……這時我們就要定義更多類,什么總經(jīng)理類啦~經(jīng)理類啦~主管類啦~雜七雜八的類,但是這些雜七雜八的大爺們都要求做完事情就電話通知,每個類都會有一個類似phoneCall的方法作為回調(diào)方法,這時,我們利用面向?qū)ο蟮乃枷雭砜磣是不是可以把這個回調(diào)方法抽象出來作為一個獨立的抽象類或接口呢?多態(tài)的思想油然而生~~~鑒于JAVA接口的好處,我們就定義一個名為CallBack的接口作為回調(diào)接口,再在該接口下定義一個名為backResult的抽象方法作為回調(diào)方法,讓那些總經(jīng)理類啦~經(jīng)理類啦~主管類啦~什么的都去實現(xiàn)該接口,這時候我們就來改造下我們的項目:
CallBack代碼如下:
package com.aige.test; /** * @description 回調(diào)接口 * @author Walid* @since 2014/11/6 */ public interface CallBack { // 回調(diào)方法 public void backResult(String result); }Manager代碼改造后如下:實現(xiàn)CallBack接口重寫backResult方法
package com.aige.test; /** * @description 該類用來模擬總經(jīng)理 * @author Walid* @since 2014/11/6 */ public class Manager implements CallBack { /** * @param personnel 傳入一個員工類的對象 */ public Manager(Personnel personnel) { // 想讓該讓員工做什么 personnel.doSomething(this, "整理公司文件"); } /** * @description 當(dāng)員工做完總經(jīng)理讓他做的事后就通過該方法通知總經(jīng)理 * @param result 事情結(jié)果 */ public void backResult(String result) { System.out.println("事情" + result); } }Personnel代碼改造后如下:doSomething方法不再傳入一個Manager對象而是一個CallBack接口
package com.aige.test; /** * @description 該類用來模擬員工 * @author Walid* @since 2014/11/6 */ public class Personnel { public void doSomething(CallBack callBack, String task) { // 總經(jīng)理通過doSomething方法告訴員工要做什么 System.out.println("總經(jīng)理要你做" + task); String result = "做完了"; // 當(dāng)事情做完了我們就通過總經(jīng)理公布的phoneCall方法通知總經(jīng)理結(jié)果 callBack.backResult(result); } }Main代碼不變,執(zhí)行結(jié)果也是一樣的。
至此,回調(diào)的基本概念差不多就是這樣了~其實回調(diào)真心不難理解,但是回調(diào)在Android中相當(dāng)重要,幾乎處處可見回調(diào)機制,如果你能理解到回調(diào)的奧秘~我相信對你的Android技術(shù)是一個不小的提升
總結(jié)
- 上一篇: GitHub优秀开源项目收集
- 下一篇: sublime text 2 下的Mar