設計模式學習(十四):模板方法

2022-11-12 09:01:06

設計模式學習(十四):模板方法

作者:Grey

原文地址:

部落格園:設計模式學習(十四):模板方法

CSDN:設計模式學習(十四):模板方法

模板方法

模板方法是一種行為型模式。

假設我們要實現一個遊戲,這個遊戲有「初始化」,「啟動」,「結束」三個方法,那麼可以定義一個遊戲的模板:

public abstract class Game {
    // 遊戲初始化
    protected abstract void init();
    // 遊戲開始
    protected abstract void start();
    // 遊戲結束
    protected abstract void end();
    // 玩遊戲方法
    protected final void play() {
        init();
        start();
        end();
    }
}

每種類似這樣結構(有「初始化」,「啟動」,「結束」三個步驟)的遊戲都可以繼承這個類來實現這三個方法,比如:

BasketballGame

public class BasketballGame extends Game {
    @Override
    protected void init() {
        System.out.println("basketball init");
    }

    @Override
    protected void start() {
        System.out.println("basketball start");
    }

    @Override
    protected void end() {
        System.out.println("basketball end");
    }
}

FootballGame

public class FootballGame extends Game {
    @Override
    protected void init() {
        System.out.println("football init");
    }

    @Override
    protected void start() {
        System.out.println("football start");
    }

    @Override
    protected void end() {
        System.out.println("football end");
    }
}

主方法在呼叫的時候,直接呼叫其 play() 方法,就可以了。

Game basketballGame = new BasketballGame();
basketballGame.play();
Game footballGame = new FootballGame();
footballGame.play();

本範例的 UML 圖如下:

另外一個例子,

假設我們要設計一系列的測試用例,然後執行這些測試用例的的測試方法,可以抽象出一個 TestCase 的模板方法,程式碼如下

public abstract class TestCase {
    public void run() {
        if (doTest()) {
            System.out.println("Test succeed.");
        } else {
            System.out.println("Test failed.");
        }
    }

    public abstract boolean doTest();
}

其中 TestCase 是抽象類,doTest() 是抽象方法,這樣每個具體的測試用例,就只需要繼承這個抽象類,並且實現其具體的 doTest()方法即可。

public class UserServiceTest extends TestCase {

    @Override
    public boolean doTest() {
        System.out.println("do test...");
        return false;
    }

}

主方法在呼叫的時候,直接把一系列的 TestCase 進行遍歷並執行 run() 方法即可

public class JunitApplication {
    private static final List<TestCase> testCases = new ArrayList<>();

    public static void register(TestCase testCase) {
        testCases.add(testCase);
    }

    public static final void main(String[] args) {
        for (TestCase c : testCases) {
            c.run();
        }
    }
}

模板方法實際應用場景舉例

  • Spring 中的 RestTemplate 、JDBCTemplate 等。

  • Java SE 中的 Collections.sort() 方法也可以看成模板方法。

  • Java SE 中的 AbstractList 類定義了一些模板方法,ArrayList 作為子類實現了對應的模板方法。

  • MyBatis 中的 BaseExecutor 定義了模板方法,子類 ReuseExecutor 、SimpleExecutor 、BatchExecutor 和 ClosedExecutor 實現了對應的模板方法

  • Redission 的紅鎖和聯鎖設計。

UML 和 程式碼

UML 圖

程式碼

更多

設計模式學習專欄

參考資料