qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          理解Java當中的回調機制

          你好,今天我要和大家分享一些東西,舉例來說這個在JavaScript中用的很多。我要講講回調(callbacks)。你知道什么時候用,怎么用這個嗎?你真的理解了它在java環境中的用法了嗎?當我也問我自己這些問題,這也是我開始研究這些的原因。這個背后的思想是控制反轉( PS:維基百科的解釋是控制反轉(Inversion of Control,縮寫為IoC),是面向對象編程中的一種設計原則,可以用來減低計算機代碼之間的耦合度。)這個范例描述了框架(framework)的工作方式,也以“好萊塢原則:不要打電話給我們,我們會打給你("Hollywood principle - Don't call me, we will call you)”為人們所熟知。
            簡單的Java里的回調模式來理解它,具體的例子在下面:
          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 }
            你可能要問我,什么時候用這個或者會問直接調用和回調機制有什么不同呢?
            答案是:好吧,這個例子僅僅向你展示了怎樣在java環境中構造這樣的回調函數。當然用那種方式使用它毫無意義。讓我們現在更加深入具體地研究它。
            在它之中的思想是控制反轉。讓我們用定時器作為現實中的例子。假設你知道,有一個特別的定時器支持每小時回調的功能。準確地說意思是,每小時,定時器會調用你注冊的調用方法。
            具體的例子:
            我們想要每小時更新一次網站的時間,下面是例子的UML模型:
            回調接口:
            讓我們首先定義回調接口:
          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 }
          在我們的例子中系統定時器支持回調方法:
          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 }
            最后是我們虛擬簡單的例子中的網站時間更新器:
          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) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

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

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 都安| 高邑县| 太仓市| 大英县| 南充市| 布拖县| 德州市| 台北市| 得荣县| 伊通| 泽州县| 石渠县| 桃园市| 商都县| 浦江县| 上高县| 赣州市| 东莞市| 大姚县| 贵阳市| 共和县| 喜德县| 会同县| 余干县| 高安市| 涿州市| 资讯 | 凉山| 潞城市| 华池县| 巫溪县| 海伦市| 葵青区| 虞城县| 环江| 凤山县| 图木舒克市| 永登县| 景德镇市| 海南省| 渭源县|