1. 程式人生 > 其它 >模板方法模式和回撥機制

模板方法模式和回撥機制

模板方法模式很常用,其目的是在一個方法中定義一個演算法骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法的某些步驟。在標準的模板方法模式實現中,主要是使用繼承的方式,來讓父類在執行期間可以呼叫到子類的方法。 詳見抽象類部分示例。

其實在Java開發中,還有另外一個方法可以實現同樣的功能,那就是Java回撥技術。回撥是一種雙向的呼叫模式,也就是說,被呼叫的介面被呼叫時也會呼叫對方的介面,簡單點說明就是:A類中呼叫B類中的C方法,然後B類中的C方法中反過來呼叫A類中的D方法,那麼D這個方法就叫回調方法。

回撥的具體過程如下:

1. Class A實現介面CallBack —— 背景1

2. class A中包含class B的引用 ——背景2

3. class B有一個引數為CallBack的方法C ——背景3

4. 前三條是我們的準備條件,接下來A的物件呼叫B的方法C

5. 然後class B就可以在C方法中呼叫A的方法D

這樣說大家可能還是不太理解,下面我們根據示例5-33來說明回撥機制。該示例的生活背景為:有一天小劉遇到一個很難的問題“學習Java選哪呢?”,於是就打電話問小高,小高一時也不太瞭解行情,就跟小劉說,我現在還有事,等忙完了給你諮詢諮詢,小劉也不會傻傻的拿著電話去等小高的答案,於是小劉對小高說,先掛電話吧,你知道答案後再打我電話告訴我吧,於是掛了電話。小高先去辦自己的事情去了,過了幾個小時,小高打電話給小劉,告訴他答案是“學Java當然去北京”。

【示例5-33】回撥機制示例

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 /** *回撥介面 */ interfaceCallBack{ /** *小高知道答案後告訴小劉時需要呼叫的方法,即回撥方法 *@paramresult是問題的答案 */ public
voidanswer(Stringresult); } /** *小劉類:實現了回撥介面CallBack(背景一) */ classLiuimplementsCallBack{ /** *包含小高物件的引用(背景二) */ privateGaogao; publicLiu(Gaogao){ this.gao=gao; } /** *小劉通過這個方法去問小高 *@paramquestion小劉問的問題“學習Java選哪呢?” */ publicvoidaskQuestion(Stringquestion){ //小劉問小高問題 gao.execute(Liu.this,question); } /** *小高知道答案後呼叫此方法告訴小劉 */ @Override publicvoidanswer(Stringresult){ System.out.println("小高告訴小劉的答案是:"+result); } } /** *小高類 */ classGao{ /** *相當於classB有一個引數為CallBack的方法C(背景三) */ publicvoidexecute(CallBackcallBack,Stringquestion){ System.out.println("小劉問的問題是:"+question); //模擬小高掛點後先辦自己的事情花了很長時間 try{ Thread.sleep(10000); }catch(InterruptedExceptione){ e.printStackTrace(); } //小高辦完自己的事情後想到了答案 Stringresult="學Java當然去北京"; //小高打電話把答案告訴小劉,相當於classB反過來呼叫classA的D方法 callBack.answer(result); } } publicclassTest{ publicstaticvoidmain(String[]args){ Gaogao=newGao(); Liuliu=newLiu(gao); //小劉問問題 liu.askQuestion("學習Java選哪呢?"); } }

執行結果如圖5-34所示:

圖5-34 示例5-33執行效果圖

通過回撥在介面中定義的方法,呼叫到具體的實現類中的方法,其本質是利用Java的動態繫結技術,在這種實現中,可以不把實現類寫成單獨的類,而使用內部類或匿名內部類來實現回撥方法。