模板模式通常又叫模板方法模式(Template Method Pattern)是指定義一個算法的骨架飘蚯,并允許子類為一個或者多個步驟提供實現(xiàn)堡赔。模板方法使得子類可以在不改變算法結(jié)構(gòu)的情況下漾稀,重新定義算法的某些步驟芝加,屬于行為型設(shè)計模式耍攘。
適用場景:
1武通、一次性實現(xiàn)一個算法的不變的部分奉呛,并將可變的行為留給子類來實現(xiàn)计螺。
2、各子類中公共的行為被提取出來并集中到一個公共的父類中瞧壮,從而避免代碼重復(fù)登馒。
簡單來說:就是提取出共通或者共性的一部分內(nèi)容作為父類,然后讓每一個子類去實現(xiàn)共性的邏輯咆槽,同時子類可以添加自己的邏輯
代碼實現(xiàn)
/**
* 模板會有一個或者多個未現(xiàn)實方法陈轿,
* 而且這幾個未實現(xiàn)方法有固定的執(zhí)行循序
* 抽象出公共的模塊
*/
public abstract class NetworkCourse {
protected final void createCourse(){
//1、發(fā)布預(yù)習(xí)資料
this.postPreResource();
//2秦忿、制作 PPT 課件
this.createPPT();
//3麦射、在線直播
this.liveVideo();
//4、提交課件灯谣、課堂筆記
this.postNote();
//5潜秋、提交源碼
this.postSource();
//6、布置作業(yè)胎许,有些課是沒有作業(yè)峻呛,有些課是有作業(yè)的
//如果有作業(yè)的話,檢查作業(yè)辜窑,如果沒作業(yè)钩述,完成了
if(needHomework()){
checkHomework();
}
}
abstract void checkHomework();
//鉤子方法:實現(xiàn)流程的微調(diào),判斷是否有作業(yè)
/**
* 鉤子函數(shù)的目的:用來干預(yù)執(zhí)行流程谬擦,使得我們控制行為流程
* 更加靈活切距,更符合實際業(yè)務(wù)的需求朽缎,鉤子函數(shù)的返回值一般
* 比較明顯的判斷惨远,例如boolean、int
*/
protected boolean needHomework(){return false;}
final void postPreResource(){
System.out.println("分發(fā)預(yù)習(xí)資料");
}
final void createPPT(){
System.out.println("創(chuàng)建備課 PPT");
}
final void liveVideo(){
System.out.println("直播授課");
}
final void postNote(){
System.out.println("提交課件和筆記");
}
final void postSource(){
System.out.println("提交源代碼");
}
}
子類實現(xiàn)流程
public class JavaCourse extends NetworkCourse {
void checkHomework() {
System.out.println("檢查 Java 的架構(gòu)課件");
}
}
public class BigDataCourse extends NetworkCourse {
private boolean needHomeworkFlag = false;
public BigDataCourse(boolean needHomeworkFlag) {
this.needHomeworkFlag = needHomeworkFlag;
}
void checkHomework() {
System.out.println("檢查大數(shù)據(jù)的課后作業(yè)");
}
@Override
protected boolean needHomework() {
return this.needHomeworkFlag;
}
}
測試
public class NetworkCourseTest {
public static void main(String[] args) {
System.out.println("---Java 架構(gòu)師課程---");
NetworkCourse javaCourse = new JavaCourse();
javaCourse.createCourse();
//子類自己定義了一項 checkHomework
System.out.println("---大數(shù)據(jù)課程---");
NetworkCourse bigDataCourse = new BigDataCourse(true);
bigDataCourse.createCourse();
}
}
優(yōu)點
1话肖、利用模板方法將相同處理邏輯的代碼放到抽象父類中北秽,可以提高代碼的復(fù)用性。
2最筒、將不同的代碼不同的子類中贺氓,通過對子類的擴展增加新的行為,提高代碼的擴展性床蜘。
3辙培、把不變的行為寫在父類上蔑水,去除子類的重復(fù)代碼,提供了一個很好的代碼復(fù)用平臺扬蕊,符合開閉原則搀别。
缺點:
1、類數(shù)目的增加尾抑,每一個抽象類都需要一個子類來實現(xiàn)歇父,這樣導(dǎo)致類的個數(shù)增加。
2再愈、類數(shù)量的增加榜苫,間接地增加了系統(tǒng)實現(xiàn)的復(fù)雜度。
3翎冲、繼承關(guān)系自身缺點垂睬,如果父類添加新的抽象方法,所有子類都要改一遍抗悍。