作者:Grey
原文地址:
模板方法是一種行為型模式。
假設我們要實現一個遊戲,這個遊戲有「初始化」,「啟動」,「結束」三個方法,那麼可以定義一個遊戲的模板:
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 的紅鎖和聯鎖設計。
本文來自部落格園,作者:Grey Zeng,轉載請註明原文連結:https://www.cnblogs.com/greyzeng/p/16882638.html