模板方法模式和回撥機制
模板方法模式很常用,其目的是在一個方法中定義一個演算法骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法的某些步驟。在標準的模板方法模式實現中,主要是使用繼承的方式,來讓父類在執行期間可以呼叫到子類的方法。 詳見抽象類部分示例。
其實在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 |
/**
*回撥介面
*/
interface CallBack{
/**
*小高知道答案後告訴小劉時需要呼叫的方法,即回撥方法
*@paramresult是問題的答案
*/
public void answer(Stringresult);
}
/**
*小劉類:實現了回撥介面CallBack(背景一)
*/
class Liu implements CallBack{
/**
*包含小高物件的引用(背景二)
*/
private Gaogao;
public Liu(Gaogao){
this .gao=gao;
}
/**
*小劉通過這個方法去問小高
*@paramquestion小劉問的問題“學習Java選哪呢?”
*/
public void askQuestion(Stringquestion){
//小劉問小高問題
gao.execute(Liu. this ,question);
}
/**
*小高知道答案後呼叫此方法告訴小劉
*/
@Override
public void answer(Stringresult){
System.out.println( "小高告訴小劉的答案是:" +result);
}
}
/**
*小高類
*/
class Gao{
/**
*相當於classB有一個引數為CallBack的方法C(背景三)
*/
public void execute(CallBackcallBack,Stringquestion){
System.out.println( "小劉問的問題是:" +question);
//模擬小高掛點後先辦自己的事情花了很長時間
try {
Thread.sleep( 10000 );
} catch (InterruptedExceptione){
e.printStackTrace();
}
//小高辦完自己的事情後想到了答案
Stringresult= "學Java當然去北京" ;
//小高打電話把答案告訴小劉,相當於classB反過來呼叫classA的D方法
callBack.answer(result);
}
}
public class Test{
public static void main(String[]args){
Gaogao= new Gao();
Liuliu= new Liu(gao);
//小劉問問題
liu.askQuestion( "學習Java選哪呢?" );
}
}
|
執行結果如圖5-34所示:
圖5-34 示例5-33執行效果圖
通過回撥在介面中定義的方法,呼叫到具體的實現類中的方法,其本質是利用Java的動態繫結技術,在這種實現中,可以不把實現類寫成單獨的類,而使用內部類或匿名內部類來實現回撥方法。