理解Java當(dāng)中的回調(diào)機(jī)制(翻譯)
你好,今天我要和大家分享一些東西,舉例來說這個在JavaScript中用的很多。我要講講回調(diào)(callbacks)。你知道什么時候用,怎么用這個嗎?你真的理解了它在java環(huán)境中的用法了嗎?當(dāng)我也問我自己這些問題,這也是我開始研究這些的原因。這個背后的思想是控制反轉(zhuǎn)( PS:維基百科的解釋是控制反轉(zhuǎn)(Inversion of Control,縮寫為IoC),是面向?qū)ο缶幊讨械囊环N設(shè)計(jì)原則,可以用來減低計(jì)算機(jī)代碼之間的耦合度。)這個范例描述了框架(framework)的工作方式,也以“好萊塢原則:不要打電話給我們,我們會打給你("Hollywood principle - Don't call me, we will call you)”為人們所熟知。
簡單的Java里的回調(diào)模式來理解它,具體的例子在下面:
interface CallBack { void methodToCallBack(); } class CallBackImpl implements CallBack { public void methodToCallBack() { System.out.println("I've been called back"); } } class Caller { public void register(CallBack callback) { callback.methodToCallBack(); } public static void main(String[] args) { Caller caller = new Caller(); CallBack callBack = new CallBackImpl(); caller.register(callBack); } }
你可能要問我,什么時候用這個或者會問直接調(diào)用和回調(diào)機(jī)制有什么不同呢?
答案是:好吧,這個例子僅僅向你展示了怎樣在java環(huán)境中構(gòu)造這樣的回調(diào)函數(shù)。當(dāng)然用那種方式使用它毫無意義。讓我們現(xiàn)在更加深入具體地研究它。
在它之中的思想是控制反轉(zhuǎn)。讓我們用定時器作為現(xiàn)實(shí)中的例子。假設(shè)你知道,有一個特別的定時器支持每小時回調(diào)的功能。準(zhǔn)確地說意思是,每小時,定時器會調(diào)用你注冊的調(diào)用方法。
具體的例子:
我們想要每小時更新一次網(wǎng)站的時間,下面是例子的UML模型:
回調(diào)接口:
讓我們首先定義回調(diào)接口:
import java.util.ArrayList; import java.util.List; // For example: Let's assume that this interface is offered from your OS to be implemented interface TimeUpdaterCallBack { void updateTime(long time); } // this is your implementation. // for example: You want to update your website time every hour class WebSiteTimeUpdaterCallBack implements TimeUpdaterCallBack { @Override public void updateTime(long time) { // print the updated time anywhere in your website's example System.out.println(time); } }
在我們的例子中系統(tǒng)定時器支持回調(diào)方法:
// This is the SystemTimer implemented by your Operating System (OS) // You don't know how this timer was implemented. This example just // show to you how it could looks like. How you could implement a // callback by yourself if you want to. class SystemTimer { List<TimeUpdaterCallBack> callbacks = new ArrayList<TimeUpdaterCallBack>(); public void registerCallBackForUpdatesEveryHour(TimeUpdaterCallBack timerCallBack) { callbacks.add(timerCallBack); } // ... This SystemTimer may have more logic here we don't know ... // At some point of the implementaion of this SystemTimer (you don't know) // this method will be called and every registered timerCallBack // will be called. Every registered timerCallBack may have a totally // different implementation of the method updateTime() and my be // used in different ways by different clients. public void oneHourHasBeenExprired() { for (TimeUpdaterCallBack timerCallBack : callbacks) { timerCallBack.updateTime(System.currentTimeMillis()); } } }
最后是我們虛擬簡單的例子中的網(wǎng)站時間更新器:
// This is our client. It will be used in our WebSite example. It shall update // the website's time every hour. class WebSiteTimeUpdater { public static void main(String[] args) { SystemTimer SystemTimer = new SystemTimer(); TimeUpdaterCallBack webSiteCallBackUpdater = new WebSiteTimeUpdaterCallBack(); SystemTimer.registerCallBackForUpdatesEveryHour(webSiteCallBackUpdater); } }
原文:http://cleancodedevelopment-qualityseal.blogspot.com/2012/10/understanding-callbacks-with-java.html
相關(guān)文章
Java實(shí)現(xiàn)的zip工具類完整實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)的zip工具類,結(jié)合完整實(shí)例形式分析了Java針對zip文件指定路徑壓縮、遞歸壓縮等相關(guān)操作技巧,需要的朋友可以參考下2018-12-12Dubbo?LoadBalance基于權(quán)重的隨機(jī)負(fù)載均衡算法提高服務(wù)性能
這篇文章主要為大家介紹了Dubbo?LoadBalance基于權(quán)重的隨機(jī)負(fù)載均衡算法提高服務(wù)性能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2023-10-10Java中Hashtable類與HashMap類的區(qū)別詳解
Hashtable的應(yīng)用非常廣泛,HashMap是新框架中用來代替Hashtable的類,也就是說建議使用HashMap,不要使用Hashtable??赡苣阌X得Hashtable很好用,為什么不用呢?這里簡單分析他們的區(qū)別。2016-01-01