理解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í)專欄