前言
今天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)
目錄
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類圖 & 組成
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)