qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

          理解Java當(dāng)中的回調(diào)機(jī)制

          你好,今天我要和大家分享一些東西,舉例來(lái)說(shuō)這個(gè)在JavaScript中用的很多。我要講講回調(diào)(callbacks)。你知道什么時(shí)候用,怎么用這個(gè)嗎?你真的理解了它在java環(huán)境中的用法了嗎?當(dāng)我也問(wèn)我自己這些問(wèn)題,這也是我開(kāi)始研究這些的原因。這個(gè)背后的思想是控制反轉(zhuǎn)( PS:維基百科的解釋是控制反轉(zhuǎn)(Inversion of Control,縮寫為IoC),是面向?qū)ο缶幊讨械囊环N設(shè)計(jì)原則,可以用來(lái)減低計(jì)算機(jī)代碼之間的耦合度。)這個(gè)范例描述了框架(framework)的工作方式,也以“好萊塢原則:不要打電話給我們,我們會(huì)打給你("Hollywood principle - Don't call me, we will call you)”為人們所熟知。
            簡(jiǎn)單的Java里的回調(diào)模式來(lái)理解它,具體的例子在下面:
          1 interface CallBack {
          2     void methodToCallBack();
          3 }
          4
          5 class CallBackImpl implements CallBack {
          6     public void methodToCallBack() {
          7         System.out.println("I've been called back");
          8     }
          9 }
          10
          11 class Caller {
          12
          13     public void register(CallBack callback) {
          14         callback.methodToCallBack();
          15     }
          16
          17     public static void main(String[] args) {
          18         Caller caller = new Caller();
          19         CallBack callBack = new CallBackImpl();
          20         caller.register(callBack);
          21     }
          22 }
            你可能要問(wèn)我,什么時(shí)候用這個(gè)或者會(huì)問(wèn)直接調(diào)用和回調(diào)機(jī)制有什么不同呢?
            答案是:好吧,這個(gè)例子僅僅向你展示了怎樣在java環(huán)境中構(gòu)造這樣的回調(diào)函數(shù)。當(dāng)然用那種方式使用它毫無(wú)意義。讓我們現(xiàn)在更加深入具體地研究它。
            在它之中的思想是控制反轉(zhuǎn)。讓我們用定時(shí)器作為現(xiàn)實(shí)中的例子。假設(shè)你知道,有一個(gè)特別的定時(shí)器支持每小時(shí)回調(diào)的功能。準(zhǔn)確地說(shuō)意思是,每小時(shí),定時(shí)器會(huì)調(diào)用你注冊(cè)的調(diào)用方法。
            具體的例子:
            我們想要每小時(shí)更新一次網(wǎng)站的時(shí)間,下面是例子的UML模型:
            回調(diào)接口:
            讓我們首先定義回調(diào)接口:
          1 import java.util.ArrayList;
          2 import java.util.List;
          3
          4 // For example: Let's assume that this interface is offered from your OS to be implemented
          5 interface TimeUpdaterCallBack {
          6     void updateTime(long time);
          7 }
          8
          9 // this is your implementation.
          10 // for example: You want to update your website time every hour
          11 class WebSiteTimeUpdaterCallBack implements TimeUpdaterCallBack {
          12
          13     @Override
          14     public void updateTime(long time) {
          15         // print the updated time anywhere in your website's example
          16         System.out.println(time);
          17     }
          18 }
          在我們的例子中系統(tǒng)定時(shí)器支持回調(diào)方法:
          1 // This is the SystemTimer implemented by your Operating System (OS)
          2 // You don't know how this timer was implemented. This example just
          3 // show to you how it could looks like. How you could implement a
          4 // callback by yourself if you want to.
          5 class SystemTimer {
          6
          7     List<TimeUpdaterCallBack> callbacks = new ArrayList<TimeUpdaterCallBack>();
          8
          9     public void registerCallBackForUpdatesEveryHour(TimeUpdaterCallBack timerCallBack) {
          10         callbacks.add(timerCallBack);
          11     }
          12
          13     // ... This SystemTimer may have more logic here we don't know ...
          14
          15     // At some point of the implementaion of this SystemTimer (you don't know)
          16     // this method will be called and every registered timerCallBack
          17     // will be called. Every registered timerCallBack may have a totally
          18     // different implementation of the method updateTime() and my be
          19     // used in different ways by different clients.
          20     public void oneHourHasBeenExprired() {
          21
          22         for (TimeUpdaterCallBack timerCallBack : callbacks) {
          23             timerCallBack.updateTime(System.currentTimeMillis());
          24         }
          25     }
          26 }
            最后是我們虛擬簡(jiǎn)單的例子中的網(wǎng)站時(shí)間更新器:
          1 // This is our client. It will be used in our WebSite example. It shall update
          2 // the website's time every hour.
          3 class WebSiteTimeUpdater {
          4
          5     public static void main(String[] args) {
          6         SystemTimer SystemTimer = new SystemTimer();
          7         TimeUpdaterCallBack webSiteCallBackUpdater = new WebSiteTimeUpdaterCallBack();
          8         SystemTimer.registerCallBackForUpdatesEveryHour(webSiteCallBackUpdater);
          9     }
          10 }

          posted on 2014-09-18 10:04 順其自然EVO 閱讀(168) 評(píng)論(0)  編輯  收藏 所屬分類: 測(cè)試學(xué)習(xí)專欄

          <2014年9月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 重庆市| 蛟河市| 尼勒克县| 杭锦后旗| 子洲县| 成武县| 张掖市| 北安市| 伊宁县| 铁岭市| 景德镇市| 防城港市| 峨眉山市| 旬邑县| 秦安县| 崇左市| 陆良县| 和政县| 崇阳县| 集安市| 瑞安市| 桃园县| 洛浦县| 隆德县| 东明县| 古浪县| 如皋市| 西充县| 西乌珠穆沁旗| 富锦市| 荥经县| 香河县| 建水县| 三河市| 东乌珠穆沁旗| 安西县| 陕西省| 赤峰市| 明溪县| 罗定市| 什邡市|