原文地址:http://www.work100.net/training/monolithic-architecture-design-patterns-template-pattern.html
更多教程:光束雲 - 免費課程
模板模式
序號 | 文內章節 | 視頻 |
---|---|---|
1 | 概述 | - |
2 | 實現 | - |
請參照如上章節導航
進行閱讀
1.概述
在模板模式(Template Pattern
)中,一個抽象類公開定義了執行它的方法的方式/模板。它的子類可以按需要重寫方法實現,但調用將以抽象類中定義的方式進行。這種類型的設計模式屬於行爲型模式。
意圖:
定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
主要解決:
一些方法通用,卻在每一個子類都重新寫了這一方法。
何時使用:
有一些通用的方法。
如何解決:
將這些通用算法抽象出來。
關鍵代碼:
在抽象類實現,其他步驟在子類實現。
應用實例:
- 在造房子的時候,地基、走線、水管都一樣,只有在建築的後期纔有加壁櫥加柵欄等差異。
- 西遊記裏面菩薩定好的 81 難,這就是一個頂層的邏輯骨架。
- Spring 中對 Hibernate 的支持,將一些已經定好的方法封裝起來,比如開啓事務、獲取 Session、關閉 Session 等,程序員不重複寫那些已經規範好的代碼,直接丟一個實體就可以保存。
優點:
- 封裝不變部分,擴展可變部分。
- 提取公共代碼,便於維護。
- 行爲由父類控制,子類實現。
缺點:
每一個不同的實現都需要一個子類來實現,導致類的個數增加,使得系統更加龐大。
使用場景:
- 有多個子類共有的方法,且邏輯相同。
- 重要的、複雜的方法,可以考慮作爲模板方法。
注意事項:
爲防止惡意操作,一般模板方法都加上 final
關鍵詞。
2.實現
我們將創建一個定義操作的 Game
抽象類,其中,模板方法設置爲 final
,這樣它就不會被重寫。
Cricket
和 Football
是擴展了 Game
的實體類,它們重寫了抽象類的方法。
TemplatePatternDemo
,我們的演示類使用 Game
來演示模板模式的用法。
步驟 1
創建一個抽象類,它的模板方法被設置爲 final
。
Game.java
,代碼如下:
public abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
//模板
public final void play(){
//初始化遊戲
initialize();
//開始遊戲
startPlay();
//結束遊戲
endPlay();
}
}
步驟 2
創建擴展了上述類的實體類。
Cricket.java
,代碼如下:
public class Cricket extends Game {
@Override
void endPlay() {
System.out.println("Cricket Game Finished!");
}
@Override
void initialize() {
System.out.println("Cricket Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Cricket Game Started. Enjoy the game!");
}
}
Football.java
,代碼如下:
public class Football extends Game {
@Override
void endPlay() {
System.out.println("Football Game Finished!");
}
@Override
void initialize() {
System.out.println("Football Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Football Game Started. Enjoy the game!");
}
}
步驟 3
使用 Game
的模板方法 play()
來演示遊戲的定義方式。
TemplatePatternDemo.java
,代碼如下:
public class TemplatePatternDemo {
public static void main(String[] args) {
Game game = new Cricket();
game.play();
System.out.println();
game = new Football();
game.play();
}
}
步驟 4
執行程序,輸出結果:
Cricket Game Initialized! Start playing.
Cricket Game Started. Enjoy the game!
Cricket Game Finished!
Football Game Initialized! Start playing.
Football Game Started. Enjoy the game!
Football Game Finished!
如果對課程內容感興趣,可以掃碼關注我們的
公衆號
或QQ羣
,及時關注我們的課程更新