一、前言
在我們的某些項目中,一些流程步驟或者算法往往都已經是固定好了的,唯一不同的是這些流程步驟或者算法中,某一個小的步驟有不同的實現方式。我們將這些不同實現方式的步驟抽取出來,將整個流程或者算法固定住,不允許子類改變,子類唯一可以做的就是現實父類中抽象的步驟或者方法。這種結構的設計模式我們稱之爲模板模式。
二、模板模式
概述:在模板模式(Template Pattern)中,一個抽象類公開定義了執行它的方法的方式/模板。它的子類可以按需要重寫方法實現,但調用將以抽象類中定義的方式進行。
使用場景:
1.一次性實現一個算法的不變的部分,並將可變的行爲留給子類來實現。
2.各子類中公共的行爲應被提取出來並集中到一個公共父類中以避免代碼重複。 首先識別現有代碼中的不同之處,並且將不同之處分離爲新的操作。 最後,用一個調用這些新的操作的模板方法來替換這些不同的代碼。
3.控制子類擴展。
優點: 1、封裝不變部分,擴展可變部分。 2、提取公共代碼,便於維護。 3、行爲由父類控制,子類實現。
缺點:每一個不同的實現都需要一個子類來實現,導致類的個數增加,使得系統更加龐大。
我們在使用模板方式的時候,一般都需要給模板方法加上final修飾符,避免被惡意篡改。
三、代碼展示
我們舉一個打印的小例子,來演示模式。
3.1 將打印的流程固定封裝好,都不同實現的地方進行抽象。
public abstract class Template {
public abstract void print();
public void update() {
System.out.println("開始打印");
for (int i = 0; i < 10; i++) {
print();
}
}
}
3.2 子類實現抽象部分的行爲
public class TemplateConcrete extends Template {
@Override
public void print() {
System.out.println("打印圖片");
}
}
3.3 結果展示
public class Test {
public static void main(String[] args) {
Template temp = new TemplateConcrete();
temp.update();
}
}
開始打印
打印圖片
打印圖片
打印圖片
打印圖片
打印圖片
打印圖片
打印圖片
打印圖片
打印圖片
打印圖片