Carson帶你學(xué)設(shè)計(jì)模式:模板方法模式(Template Method)

前言

今天Carson來全面總結(jié)最常用的設(shè)計(jì)模式 - 模板方法模式。

其他設(shè)計(jì)模式介紹
這是一份全面 & 詳細(xì)的設(shè)計(jì)模式學(xué)習(xí)指南
Carson帶你學(xué)設(shè)計(jì)模式:?jiǎn)卫J剑⊿ingleton)
Carson帶你學(xué)設(shè)計(jì)模式:簡(jiǎn)單工廠模式(SimpleFactoryPattern)
Carson帶你學(xué)設(shè)計(jì)模式:工廠方法模式(Factory Method)
Carson帶你學(xué)設(shè)計(jì)模式:抽象工廠模式(Abstract Factory)
Carson帶你學(xué)設(shè)計(jì)模式:策略模式(Strategy Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:適配器模式(Adapter Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:靜態(tài)代理模式(Proxy Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:動(dòng)態(tài)代理模式(Proxy Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:模板方法模式(Template Method)
Carson帶你學(xué)設(shè)計(jì)模式:建造者模式(Builder Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:外觀模式(Facade Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:觀察者模式(Observer)


目錄

模板方法模式.jpg

1. 介紹

1.1 定義

定義一個(gè)模板結(jié)構(gòu),將具體內(nèi)容延遲到子類去實(shí)現(xiàn)。

1.2 主要作用

在不改變模板結(jié)構(gòu)的前提下在子類中重新定義模板中的內(nèi)容。

模板方法模式是基于”繼承“的;

1.3 解決的問題

  • 提高代碼復(fù)用性
    將相同部分的代碼放在抽象的父類中,而將不同的代碼放入不同的子類中
  • 實(shí)現(xiàn)了反向控制
    通過一個(gè)父類調(diào)用其子類的操作,通過對(duì)子類的具體實(shí)現(xiàn)擴(kuò)展不同的行為,實(shí)現(xiàn)了反向控制 & 符合“開閉原則”

2. 模式原理

2.1 UML類圖 & 組成

UML類圖

2.2 實(shí)例講解

接下來我用一個(gè)實(shí)例來對(duì)模板方法模式進(jìn)行更深一步的介紹。
a. 實(shí)例概況

  • 背景:小成希望學(xué)炒菜:手撕包菜 & 蒜蓉炒菜心
  • 沖突:兩道菜的炒菜步驟有的重復(fù)有的卻差異很大,記不住
  • 解決方案:利用代碼記錄下來

b. 使用步驟
步驟1:創(chuàng)建抽象模板結(jié)構(gòu)(Abstract Class):炒菜的步驟


public  abstract class Abstract Class {  
//模板方法,用來控制炒菜的流程 (炒菜的流程是一樣的-復(fù)用)
//申明為final,不希望子類覆蓋這個(gè)方法,防止更改流程的執(zhí)行順序 
        final void cookProcess(){  
        //第一步:倒油
        this.pourOil();
        //第二步:熱油
         this.HeatOil();
        //第三步:倒蔬菜
         this.pourVegetable();
        //第四步:倒調(diào)味料
         this.pourSauce();
        //第五步:翻炒
         this.fry();
    }  

//定義結(jié)構(gòu)里哪些方法是所有過程都是一樣的可復(fù)用的,哪些是需要子類進(jìn)行實(shí)現(xiàn)的

//第一步:倒油是一樣的,所以直接實(shí)現(xiàn)
void pourOil(){  
        System.out.println("倒油");  
    }  

//第二步:熱油是一樣的,所以直接實(shí)現(xiàn)
    void  HeatOil(){  
        System.out.println("熱油");  
    }  

//第三步:倒蔬菜是不一樣的(一個(gè)下包菜,一個(gè)是下菜心)
//所以聲明為抽象方法,具體由子類實(shí)現(xiàn) 
    abstract void  pourVegetable();

//第四步:倒調(diào)味料是不一樣的(一個(gè)下辣椒,一個(gè)是下蒜蓉)
//所以聲明為抽象方法,具體由子類實(shí)現(xiàn) 
    abstract void  pourSauce();


//第五步:翻炒是一樣的,所以直接實(shí)現(xiàn)
    void fry();{  
        System.out.println("炒啊炒啊炒到熟啊");  
    }  
}

步驟2:創(chuàng)建具體模板(Concrete Class),即”手撕包菜“和”蒜蓉炒菜心“的具體步驟

//炒手撕包菜的類
  public class ConcreteClass_BaoCai extend  Abstract Class{
    @Override
    public void  pourVegetable(){  
        System.out.println(”下鍋的蔬菜是包菜“);  
    }  
    @Override
    public void  pourSauce(){  
        System.out.println(”下鍋的醬料是辣椒“);  
    }  
}
//炒蒜蓉菜心的類
  public class ConcreteClass_CaiXin extend  Abstract Class{
    @Override
    public void  pourVegetable(){  
        System.out.println(”下鍋的蔬菜是菜心“);  
    }  
    @Override
    public void  pourSauce(){  
        System.out.println(”下鍋的醬料是蒜蓉“);  
    }  
}

步驟3:客戶端調(diào)用-炒菜了

public class Template Method{
  public static void main(String[] args){

//炒 - 手撕包菜
    ConcreteClass_BaoCai BaoCai = new ConcreteClass_BaoCai();
    BaoCai.cookProcess();

//炒 - 蒜蓉菜心
  ConcreteClass_ CaiXin = new ConcreteClass_CaiXin();
    CaiXin.cookProcess();
    }
        
}
   

結(jié)果輸出

倒油
熱油
下鍋的蔬菜是包菜
下鍋的醬料是辣椒
炒啊炒啊炒到熟

倒油
熱油
下鍋的蔬菜是菜心
下鍋的醬料是蒜蓉
炒啊炒啊炒到熟

通過上述這個(gè)常見的生活例子,我相信你已經(jīng)完全明白了模板方法模式的原理了?。?/h3>

3. 優(yōu)缺點(diǎn)

在全面解析完模板方法模式后,我來分析下其優(yōu)缺點(diǎn):

3.1 優(yōu)點(diǎn)

  • 提高代碼復(fù)用性
    將相同部分的代碼放在抽象的父類中
  • 提高了拓展性
    將不同的代碼放入不同的子類中,通過對(duì)子類的擴(kuò)展增加新的行為
  • 實(shí)現(xiàn)了反向控制
    通過一個(gè)父類調(diào)用其子類的操作,通過對(duì)子類的擴(kuò)展增加新的行為,實(shí)現(xiàn)了反向控制 & 符合“開閉原則”

3.2 缺點(diǎn)

引入了抽象類,每一個(gè)不同的實(shí)現(xiàn)都需要一個(gè)子類來實(shí)現(xiàn),導(dǎo)致類的個(gè)數(shù)增加,從而增加了系統(tǒng)實(shí)現(xiàn)的復(fù)雜度。


4. 應(yīng)用場(chǎng)景

  • 一次性實(shí)現(xiàn)一個(gè)算法的不變的部分,并將可變的行為留給子類來實(shí)現(xiàn);
  • 各子類中公共的行為應(yīng)被提取出來并集中到一個(gè)公共父類中以避免代碼重復(fù);
  • 控制子類的擴(kuò)展。

5. 總結(jié)

  • 本文主要對(duì)模板方法模式進(jìn)行了全面介紹
  • 接下來我會(huì)對(duì)每種設(shè)計(jì)模式進(jìn)行詳細(xì)的分析,歡迎關(guān)注Carson_Ho的簡(jiǎn)書,不定期分享關(guān)于安卓開發(fā)的干貨,追求短、平、快,但卻不缺深度

請(qǐng)點(diǎn)贊!因?yàn)槟愕墓膭?lì)是我寫作的最大動(dòng)力!

相關(guān)文章閱讀
這是一份全面 & 詳細(xì)的設(shè)計(jì)模式學(xué)習(xí)指南
Carson帶你學(xué)設(shè)計(jì)模式:?jiǎn)卫J剑⊿ingleton)
Carson帶你學(xué)設(shè)計(jì)模式:簡(jiǎn)單工廠模式(SimpleFactoryPattern)
Carson帶你學(xué)設(shè)計(jì)模式:工廠方法模式(Factory Method)
Carson帶你學(xué)設(shè)計(jì)模式:抽象工廠模式(Abstract Factory)
Carson帶你學(xué)設(shè)計(jì)模式:策略模式(Strategy Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:適配器模式(Adapter Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:靜態(tài)代理模式(Proxy Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:動(dòng)態(tài)代理模式(Proxy Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:模板方法模式(Template Method)
Carson帶你學(xué)設(shè)計(jì)模式:建造者模式(Builder Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:外觀模式(Facade Pattern)
Carson帶你學(xué)設(shè)計(jì)模式:觀察者模式(Observer)

最后編輯于
?著作權(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)容