模板方法設計模式
抽象類體現的就是一種模板模式的設計,抽象類做爲多個子類的通用模板,子類在抽象類的基礎上進行拓展、改造,但子類整體上會保留抽象類的行爲方式。java
模板方法解決的問題
當功能內部一部分實現是肯定的,一部分實現是不肯定的。這時能夠把不肯定的部分暴露出去,讓子類去實現。
換句話說,在軟件開發中實現一個算法時,總體的步驟很固定、通用,這些步驟已經在父類中寫好了。可是某些部分不肯定,不肯定的部分能夠抽象出來,供不一樣子類實現。這就是一種模板模式。web
代碼舉例
咱們建立一個父類Template,該父類咱們建立一個spendTime的方法,想計算出某一段代碼的運行時間。總體的步驟就是:
①獲取當前的時間
②代碼(就是你想測試運行時間的代碼)
③獲取當前的時間
④兩次獲取的時間相減,就得出②號代碼運行的時間了
可是!問題在於,②號到底要測試什麼代碼,有好幾種狀況,咱們不肯定,但是①②④的步驟咱們是百分之一萬肯定的。因此就將②號須要測試的代碼,在父類Template中,給封裝成一個抽象方法,讓子類去重寫,再經過多態來調用。算法
public class TemplateTest { public static void main(String[] args) { //此處爲多態 Template sub = new SubTemplate(); sub.spendTime(); //分界線 System.out.println("**************************"); //此處爲多態 Template sub_1 = new SubTemplate_1(); sub_1.spendTime(); } } abstract class Template{ //計算某段代碼執行所須要花費的時間 public void spendTime() { //獲取當前時間 long start = System.currentTimeMillis(); //被測試代碼 code(); //獲取當前時間 long end = System.currentTimeMillis(); //輸出代碼運行時間 System.out.println("花費的時間爲:" + (end - start)); } //因爲code內具體是什麼代碼,不肯定,此處將其設爲抽象方法,交給子類去具體實現 public abstract void code(); } class SubTemplate extends Template{ //重寫父類code方法,計算一千之內的質數 public void code() { for(int i = 2;i < 1000;i++ ) { boolean isFlag = true; for(int j = 2;j < Math.sqrt(i);j++) { if(i % j == 0) { isFlag = false; break; } } if(isFlag) { System.out.println(i); } } } } class SubTemplate_1 extends Template{ //重寫父類code方法,計算五百之內的質數 public void code() { for(int i = 2;i < 500;i++ ) { boolean isFlag = true; for(int j = 2;j < Math.sqrt(i);j++) { if(i % j == 0) { isFlag = false; break; } } if(isFlag) { System.out.println(i); } } } }
一句話歸納設計模式:模板方法
父類Template就是一個模板,這個模板單獨拿出來沒有任何意義,只有根據不一樣的狀況去實例化不一樣的子類,子類重寫父類的空白的抽象方法,二者結合,纔有了意義。設計模式
總結
由上述代碼能夠總結,咱們不肯定要測試哪段代碼的執行時間,咱們就在父類中建立一個抽象方法,而後在子類中去具體實現該方法,而後經過多態來實現訪問子類中被重寫的方法,就能夠實現測試不一樣的代碼運行的時間。
此處只是舉了一個簡單的例子,模板方法還有不少用途。svg
讀者可能存在的疑惑
①父類中的public abstract void code();爲何要聲明爲抽象的,不聲明抽象,我子類也能夠重寫該方法,實現相同的效果。
答:若是父類該方法不聲明爲抽象方法,該方法就得寫成public void code(){ },而且存在萬一子類沒有重寫code方法,而後你又調用了spendTime()方法,那麼這樣子作毫無心義。此處將其聲明爲抽象方法,就會強制要求你子類中必須重寫code方法,儘可能的減小了調用了一個空的方法體的可能,若是你子類重寫仍是重寫空的方法體,那這樣子作也沒意義呀。測試
②父類Template和子類code都不聲明爲抽象,也能夠實現上述狀況代碼
答:此處回答同上,若是父類Template和子類code都不是抽象的,那麼就能夠直接建立一個父類的實例,調用裏面的方法,可是code方法又是空的,這樣子作毫無心義,聲明爲抽象就是不但願大家建立父類的實例,父類僅僅就是做爲一個模板而存在。spa
本文分享 CSDN - 彈彈霹靂。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。.net