Java大白話介紹~設計模式:模板方法(TemplateMethod)

模板方法設計模式

抽象類體現的就是一種模板模式的設計,抽象類做爲多個子類的通用模板,子類在抽象類的基礎上進行拓展、改造,但子類整體上會保留抽象類的行爲方式。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

相關文章
相關標籤/搜索