簡介
在模板模式(Template Pattern)中报腔,一個(gè)抽象類公開定義了執(zhí)行它的方法的方式/模板。它的子類可以按需要重寫方法實(shí)現(xiàn),但調(diào)用將以抽象類中定義的方式進(jìn)行棋返。這種類型的設(shè)計(jì)模式屬于行為型模式。
優(yōu)缺點(diǎn)&使用場景
優(yōu)點(diǎn): 1雷猪、封裝不變部分睛竣,擴(kuò)展可變部分。 2求摇、提取公共代碼射沟,便于維護(hù)。 3与境、行為由父類控制验夯,子類實(shí)現(xiàn)。
缺點(diǎn):每一個(gè)不同的實(shí)現(xiàn)都需要一個(gè)子類來實(shí)現(xiàn)嚷辅,導(dǎo)致類的個(gè)數(shù)增加簿姨,使得系統(tǒng)更加龐大。
使用場景: 1簸搞、有多個(gè)子類共有的方法扁位,且邏輯相同。 2趁俊、重要的域仇、復(fù)雜的方法,可以考慮作為模板方法寺擂。
實(shí)現(xiàn)
創(chuàng)建一個(gè)定義操作的 Game 抽象類暇务,其中泼掠,模板方法設(shè)置為 final,這樣它就不會(huì)被重寫垦细。Cricket 和 Football 是擴(kuò)展了 Game 的實(shí)體類择镇,它們重寫了抽象類的方法。演示類TemplatePatternDemo使用 Game 來演示模板模式的用法括改。
模版模式
代碼實(shí)現(xiàn)
//創(chuàng)建一個(gè)抽象類腻豌,它的模板方法被設(shè)置為 final。
//Game.java
public abstract class Game {
public abstract void initialize();
public abstract void startGame();
public abstract void endGame();
public final void play() {
initialize();
startGame();
endGame();
}
}
//創(chuàng)建擴(kuò)展了上述類的實(shí)體類嘱能。
//Cricket.java
public class Cricket extends Game {
@Override
public void initialize() {
System.out.println("Cricket Game Initialized! Start playing.");
}
@Override
public void startGame() {
System.out.println("Cricket Game Started. Enjoy the game!");
}
@Override
public void endGame() {
System.out.println("Cricket Game Finished!");
}
}
//Football.java
public class Football extends Game {
@Override
public void initialize() {
System.out.println("Football Game Initialized! Start playing.");
}
@Override
public void startGame() {
System.out.println("Football Game Started. Enjoy the game!");
}
@Override
public void endGame() {
System.out.println("Football Game Finished!");
}
}
//使用 Game 的模板方法 play() 來演示游戲的定義方式吝梅。
//TemplatePatternDemo.java
public class TemplatePatternDemo {
public static void main(String[] args) {
Game cricket = new Cricket();
cricket.play();
Game football = new Football();
football.play();
}
}