1、模板方法模式概念
1.1 介紹
在模板模式(Template Pattern)中,一個(gè)抽象類公開定義了執(zhí)行它的方法的方式/模板。它的子類可以按需要重寫方法實(shí)現(xiàn),但調(diào)用將以抽象類中定義的方式進(jìn)行。這種類型的設(shè)計(jì)模式屬于行為型模式。
1.2 定義
模板方法模式:定義一個(gè)算法的骨架,將骨架中的特定步驟延遲到子類中。模板方法模式使得子類可以不改變算法的結(jié)構(gòu)即可重新定義該算法的某些特定步驟
1.3 使用場(chǎng)景
- 系統(tǒng)需要將請(qǐng)求調(diào)用者和請(qǐng)求接收者解耦,使得調(diào)用者和接收者不直接交互。
- 系統(tǒng)需要在不同的時(shí)間指定請(qǐng)求、將請(qǐng)求排隊(duì)(如:線程池+工作隊(duì)列)和執(zhí)行請(qǐng)求。
- 系統(tǒng)需要支持命令的撤銷(Undo)操作和恢復(fù)(Redo)操作。
- 系統(tǒng)需要將一組操作組合在一起,即支持宏命令。
2、模板方法模式UML類圖
模板方法模式UML類圖
- 抽象類(AbstractClass):實(shí)現(xiàn)了模板方法,定義了算法的骨架。
- 具體類(ConcreteClass):實(shí)現(xiàn)抽象類中的抽象方法,已完成完整的算法。
3、模板方法模式代碼實(shí)現(xiàn)
AbstractClass:
public abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
public final void play(){
initialize();
startPlay();
endPlay();
}
}
ConcreteClass:
public class KingGloryGame extends Game {
@Override
void initialize() {
System.out.println("初始化王者榮耀游戲");
}
@Override
void startPlay() {
System.out.println("王者榮耀游戲開始");
}
@Override
void endPlay() {
System.out.println("王者榮耀游戲結(jié)束");
}
}
public class LoLGame extends Game {
@Override
void initialize() {
System.out.println("初始化LOL游戲");
}
@Override
void startPlay() {
System.out.println("LOL游戲開始");
}
@Override
void endPlay() {
System.out.println("LOL游戲結(jié)束");
}
}
Client:
public class Client {
public static void main(String[] args){
Game game = new LoLGame();
game.play();
game = new KingGloryGame();
game.play();
}
}
結(jié)果輸出:
初始化LOL游戲
LOL游戲開始
LOL游戲結(jié)束
初始化王者榮耀游戲
王者榮耀游戲開始
王者榮耀游戲結(jié)束
4、模板方法模式Android中使用
AsyncTask類、activity中的onCreate() 等生命周期
5、模式總結(jié)
5.1 優(yōu)點(diǎn)
- 封裝不變部分,擴(kuò)展可變部分。
- 提取公共代碼,便于維護(hù)。
- 行為由父類控制,子類實(shí)現(xiàn)。
5.2 缺點(diǎn)
- 每一個(gè)不同的實(shí)現(xiàn)都需要一個(gè)子類來實(shí)現(xiàn),導(dǎo)致類的個(gè)數(shù)增加,使得系統(tǒng)更加龐大。