Android 架構(gòu)師之路7 設(shè)計(jì)模式之模板方法模式

Android 架構(gòu)師之路 目錄

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)更加龐大。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1 場(chǎng)景問題# 1.1 登錄控制## 幾乎所有的應(yīng)用系統(tǒng),都需要系統(tǒng)登錄控制的功能,有些系統(tǒng)甚至有多個(gè)登錄控制的功...
    七寸知架構(gòu)閱讀 2,000評(píng)論 3 53
  • 設(shè)計(jì)模式基本原則 開放-封閉原則(OCP),是說軟件實(shí)體(類、模塊、函數(shù)等等)應(yīng)該可以拓展,但是不可修改。開-閉原...
    西山薄涼閱讀 3,880評(píng)論 3 14
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,466評(píng)論 25 708
  • 當(dāng)我知道你要離去 到遠(yuǎn)方過生活時(shí) 不禁輕聲念道近日來所背的詩 不曾想過 也會(huì)如此恰好 “與君離別意,同是宦游人 海...
    子芽閱讀 362評(píng)論 0 3
  • 十一月十四日凌晨一點(diǎn)我回家了,為了去見弟弟,這有點(diǎn)瘋狂,可我已經(jīng)五個(gè)月半不見他了,我提前買了兩個(gè)雞腿餅,和一盒花...
    南無NAMO閱讀 239評(píng)論 0 0