1盟榴、模板方法模式概念
1.1 介紹
在模板模式(Template Pattern)中颓影,一個(gè)抽象類公開定義了執(zhí)行它的方法的方式/模板枫虏。它的子類可以按需要重寫方法實(shí)現(xiàn),但調(diào)用將以抽象類中定義的方式進(jìn)行灸姊。這種類型的設(shè)計(jì)模式屬于行為型模式拱燃。
1.2 定義
模板方法模式:定義一個(gè)算法的骨架,將骨架中的特定步驟延遲到子類中力惯。模板方法模式使得子類可以不改變算法的結(jié)構(gòu)即可重新定義該算法的某些特定步驟
1.3 使用場景
- 系統(tǒng)需要將請求調(diào)用者和請求接收者解耦碗誉,使得調(diào)用者和接收者不直接交互。
- 系統(tǒng)需要在不同的時(shí)間指定請求父晶、將請求排隊(duì)(如:線程池+工作隊(duì)列)和執(zhí)行請求哮缺。
- 系統(tǒng)需要支持命令的撤銷(Undo)操作和恢復(fù)(Redo)操作。
- 系統(tǒng)需要將一組操作組合在一起甲喝,即支持宏命令尝苇。
2、模板方法模式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)更加龐大握牧。