在模板模式(Template Pattern)中,一個抽象類公開定義了執行它的方法的方式/模板。它的子類可以按需要重寫方法實現,但調用將以抽象類中定義的方式進行。這種類型的設計模式屬於行爲型模式。
模板模式作用
定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
主要解決:一些方法通用,卻在每一個子類都重新寫了這一方法。
何時使用:有一些通用的方法。
如何解決:將這些通用算法抽象出來。
關鍵代碼:在抽象類實現,其他步驟在子類實現。
示例代碼:
Exam.java
/**
* @Classname Exam
* @Description 考試抽象類
* @Created by xiangty
*/
public abstract class Exam {
/**
* 考試開始
*/
abstract void examBegin();
/**
* 在考試期間
*/
abstract void duringTheExamination();
/**
* 考試結束
*/
abstract void examEnd();
public final void exam(){
examBegin();
duringTheExamination();
examEnd();
}
}
ChineaseExam.java
/**
* @Classname ChineaseExam
* @Description 語文考試類
* @Created by xiangty
*/
public class ChineaseExam extends Exam {
@Override
void examBegin() {
System.out.println("語文考試開始...");
}
@Override
void duringTheExamination() {
System.out.println("語文考試中...");
}
@Override
void examEnd() {
System.out.println("語文考試結束...");
}
}
MathExam.java
/**
* @Classname MathExam
* @Description 數學考試類
* @Created by xiangty
*/
public class MathExam extends Exam {
@Override
void examBegin() {
System.out.println("數學考試開始...");
}
@Override
void duringTheExamination() {
System.out.println("數學考試中...");
}
@Override
void examEnd() {
System.out.println("數學考試結束...");
}
}
ExamTest.java
/**
* @Classname ExamTest
* @Description 模板模式測試類
* @Created by xiangty
*/
public class ExamTest {
public static void main(String[] args) {
Exam chineaseExam = new ChineaseExam();
chineaseExam.exam();
MathExam mathExam = new MathExam();
mathExam.exam();
}
}
優點: 1、封裝不變部分,擴展可變部分。 2、提取公共代碼,便於維護。 3、行爲由父類控制,子類實現。
缺點:每一個不同的實現都需要一個子類來實現,導致類的個數增加,使得系統更加龐大。
使用場景: 1、有多個子類共有的方法,且邏輯相同。 2、重要的、複雜的方法,可以考慮作爲模板方法。
注意事項:爲防止惡意操作,一般模板方法都加上 final 關鍵詞。