屢戰屢敗,屢敗屢戰;失敗是我無奈的宿命,堅韌是我不屈的靈魂

          以虛養心,以德養身;以仁養天下物,以道養天下萬世。

          2008年11月5日 #

          Spring中的Callback模式和Template模式<轉>

          Spring中的Callback模式與Template模式合用,隨處可見。Template method被廣泛的使用,像Servlet就是使用這個模式。Template mothod模式雖然能簡化很多重復的代碼,但這種模式的也有不少限制。Template mothod將一個功能的實現分成許多小的步驟,在父類中定義了這些步驟的順序,讓子類來具體實現每一個小的步驟。這些小的步驟是protected,以防止用戶不正確的使用這些小的步驟而產生異常。這樣就產生了一個限制,那就是你需要繼承Template然后重新實現具體的小步驟。如果這個Template有許多方法,就像JdbcTemplate,如果你每次繼承這個龐大的類,然后只是重寫某個小步驟中來訂制你自己的功能,就會顯得非常笨重,更何況數據庫操作使用的如此頻繁,難道你每進行一個操作就通過繼承訂制一個,顯然不可能這么做。
          -----------------至所以不完全采用Template的模式是因為Template很龐大,有許多方法,繼承它的話劃不來:顯得笨重。

          Spring使用Callback模式與之配合,達到了去掉重復代碼的效果,同時增加了很大的靈活性,你只需要實現某些CallBack就可輕松訂制出Template。
          那么什么時候才是Callback模式與Template模式結合的最佳時機呢?顯然如果每個具體的步驟都需要真正去具體實現而不是簡單的改變參數或設置某個對象就ok的話,使用Callback很難去訂制,因為你可能需要傳遞多個Callback作為參數,并讓用戶去實現,是用Java的內部類本來就是一個比較丑陋的語法,更何況參數是多個。這相當于你把每個小步驟封裝成為接口,然后分別繼承之然后實現。顯然沒有達到方便靈活的效果,這時候直接使用Template method模式就比結合Callback要好。而如果用戶只需要定制一個方法能就達到用戶的要求,或者更簡單,只是設置不同的參數,那么使用Callback就具有很好的靈活性。
          -----------------使用Template-Callback模式的時機:用戶只需要定制一兩個方法就能達到要求或只需要設置不同的參數。

          -----------------Template-Callback模式在Spring中的實現步驟:
          1. 創建一個Template對象: jdbcTemplate = new JdbcTemplate(dataSource);
          2. 該Template有個execute方法,里面含有需要你傳遞進來的參數(參數聲明可能是接口,也可能是具體類).該方法已經實現了你需要的達到目的的步驟,以及會返回你所需要的東西。你所要做的就是實現該方法所需要的參數。
          3. 創建參數并調用Template方法。你可能需要實現接口來創建Template方法所需要的參數(可能采取內部類的形式)。

          該模式如何體現了CallBack????

          軟件模塊之間總是存在著一定的接口,從調用方式上,可以把他們分為三類:同步調用、回調和異步調用。同步調用是一種阻塞式調用,調用方要等待對方執行完畢才返回, 它是一種單向調用;回調是一種雙向調用模式,也就是說,被調用方在接口被調用時也會調用對方的接口;異步調用是一種類似消息或事件的機制,不過它的調用方向剛好相反,接口的服務在收到某種訊息或發生某種事件時,會主動通知客戶方(即調用客戶方的接口)。回調和異步調用的關系非常緊密,通常我們使用回調來實現異步消息的注冊,通過異步調用來實現消息的通知。同步調用是三者當中最簡單的,而回調又常常是異步調用的基礎。

          回調就是自己定義的函數但由系統來調用。

          posted @ 2008-11-05 00:07 加隆 閱讀(185) | 評論 (0)編輯 收藏

          My Links

          Blog Stats

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          主站蜘蛛池模板: 枣强县| 蚌埠市| 盐池县| 邵阳市| 砚山县| 文登市| 弥渡县| 林甸县| 宁夏| 贵溪市| 崇左市| 美姑县| 临江市| 黎川县| 益阳市| 东方市| 恩施市| 广元市| 河南省| 广饶县| 法库县| 长岭县| 江城| 玛纳斯县| 连南| 仁怀市| 荆州市| 土默特左旗| 安阳县| 望都县| 云龙县| 乌拉特中旗| 景洪市| 汾西县| 马龙县| 右玉县| 资兴市| 个旧市| 平乡县| 汾阳市| 长岭县|