定義
模板模式通常又叫做模板方法模式(Template Method Pattern)是指定義一個算法的骨架,並允許子類爲一個或者多個步驟提供實現。
模板方法使得子類可以再不改變算法結構的情況下,重新定義算法的某些步驟。
屬於行爲型設計模式。
適用場景
- 一次性實現一個算法的不變的部分,並將可變的行爲留給子類來實現;
- 各子類中公共的行爲被提取出來並集中到一個公共的父類中,從而避免代碼重複。
UML類圖
代碼實現
模板模式會有一個或者多個未實現的方法,而且這幾個未實現的方法有固定的執行順序
NetworkCourse
public abstract class NetworkCourse {
protected final void createCourse() {
// 1.發佈預習資料
this.postPreResource();
// 2.製作PPT課件
this.createPPT();
// 3.在線直播
this.liveVideo();
// 4.提交課件、課堂筆記
this.postNote();
// 5.提交源碼
this.postSource();
// 6.佈置作業,有些課是沒有作業的,有些課是有作業的
// 如果有作業的話,檢查作業,如果沒有作業,完成了
if (needHomeWork()) {
checkHomeWork();
}
}
/**
* 檢查作業(鉤子方法),留給子類去微調
*/
abstract void checkHomeWork();
/**
* 是否有作業,默認沒有作業
* @return
*/
protected boolean needHomeWork() {
return false;
}
final void postSource() {
System.out.println("提交源代碼");
}
final void postNote() {
System.out.println("提交課件、筆記");
}
final void liveVideo() {
System.out.println("直播授課");
}
final void createPPT() {
System.out.println("創建備課PPT");
}
final void postPreResource() {
System.out.println("發佈預習資料");
}
}
JavaCourse
public class JavaCourse extends NetworkCourse {
@Override
void checkHomeWork() {
System.out.println("檢查Java的架構課件");
}
}
BigDataCourse
public class BigDataCourse extends NetworkCourse {
/**
* 是否需要家庭作業
*/
private boolean needHomeworkFlag = false;
public BigDataCourse(boolean needHomeworkFlag) {
this.needHomeworkFlag = needHomeworkFlag;
}
@Override
void checkHomeWork() {
System.out.println("檢查大數據的課後作業");
}
@Override
protected boolean needHomeWork() {
return this.needHomeworkFlag;
}
}
測試類
public class NetworkCourseTest {
public static void main(String[] args) {
System.out.println("--Java架構師課程--");
NetworkCourse javaCourse = new JavaCourse();
javaCourse.createCourse();
System.out.println("--大數據課程--");
NetworkCourse bigDataCourse = new BigDataCourse(true);
bigDataCourse.createCourse();
}
}
輸出結果
--Java架構師課程--
發佈預習資料
創建備課PPT
直播授課
提交課件、筆記
提交源代碼
--大數據課程--
發佈預習資料
創建備課PPT
直播授課
提交課件、筆記
提交源代碼
檢查大數據的課後作業
模板模式的優點
- 提高代碼的複用性;
- 提高代碼的擴展性;
- 符合開閉原則。
模板模式的缺點
- 類數目的增加;
- 間接地增加了系統實現的複雜度;
- 繼承關係自身缺點,如果父類添加新的抽象方法,所有子類都要改一遍。