網(wǎng)站建設(shè)業(yè)務(wù)經(jīng)理崗位職責(zé)百度教育網(wǎng)站
一,定義
定義一個(gè)操作中的算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
在面向?qū)ο蟮拈_(kāi)發(fā)過(guò)程中,通常會(huì)遇到這樣一個(gè)問(wèn)題,我們知道一個(gè)算法所需的關(guān)鍵步驟,并確定了這些步驟的執(zhí)行順序,但是,某些步驟的具體實(shí)現(xiàn)是未知的,或者說(shuō)某些步驟的實(shí)現(xiàn)是會(huì)隨著環(huán)境的變化而改變的,例如,執(zhí)行程序的流程大致如下:
1,檢查代碼的正確性
2,鏈接相關(guān)的類庫(kù)
3,編譯相關(guān)代碼
4,執(zhí)行程序
對(duì)于不同的程序設(shè)計(jì)語(yǔ)言,上述四個(gè)步驟都是不一樣的,但是,他們的執(zhí)行流程是固定的,這類問(wèn)題的解決方案就是模板方法模式。
模板方法實(shí)際上是封裝一個(gè)固定流程,就像是一套執(zhí)行模板一樣,第一步該做什么,第二步該做什么都已經(jīng)在抽象類中定義好。而子類可以有不同的算法實(shí)現(xiàn),在框架不被修改的情況下實(shí)現(xiàn)某些步驟的算法替換。
二,使用場(chǎng)景
1,多個(gè)子類有公有的方法,并且邏輯基本相同時(shí)。
2,重要,復(fù)雜的算法,可以把核心算法設(shè)計(jì)為模板方法,周邊的相關(guān)細(xì)節(jié)功能則由各個(gè)子類實(shí)現(xiàn)。
3,重構(gòu)時(shí),模板方法模式是一個(gè)經(jīng)常使用的模式,把相同的代碼抽取到父類中,然后通過(guò)鉤子函數(shù)約束其行為。
角色介紹:
抽象類:定義了一套算法框架
具體實(shí)現(xiàn)類:實(shí)現(xiàn)具體算法框架
三,使用案例
在英雄聯(lián)盟游戲中,玩家要開(kāi)始一場(chǎng)排位游戲,需要先1,進(jìn)入匹配隊(duì)列? 2,進(jìn)入banpick界面3,禁用英雄 4,選擇英雄 5,選擇符文和召喚師技能 6,進(jìn)入游戲
如果使用模板模式,怎么來(lái)實(shí)現(xiàn)呢?
首先定義一個(gè)抽象模板類:
public class AbsRank {public void startMate(){System.out.println("進(jìn)入匹配隊(duì)列");}public void startBp(){System.out.println("進(jìn)入bp界面");}public void startBan(){System.out.println("開(kāi)始禁用英雄");}public void select(){System.out.println("選擇英雄");}public void selectSkill(){System.out.println("選擇符文和召喚師技能");}public void begin(){System.out.println("開(kāi)始游戲");}public final void playGame(){startMate();startBp();startBan();select();selectSkill();begin();}
}
定義兩個(gè)玩家類:
public class Yuanzhen extends AbsRank{@Overridepublic void startBan() {System.out.println("禁用亞索");}@Overridepublic void select() {System.out.println("選擇劍圣");}@Overridepublic void selectSkill() {System.out.println("選擇懲戒和閃現(xiàn)");}
}
public class Xiaoming extends AbsRank{@Overridepublic void startBan() {System.out.println("禁用趙信");}@Overridepublic void select() {System.out.println("選擇蠻王");}@Overridepublic void selectSkill() {System.out.println("選擇疾跑和閃現(xiàn)");}
}
使用 :
Yuanzhen yuanzhen =new Yuanzhen();
yuanzhen.playGame();
Xiaoming xiaoming =new Xiaoming();
xiaoming.playGame();
最后結(jié)果:
四,總結(jié)
模板方法模式用四個(gè)字概括就是:流程封裝。也就是把某個(gè)固定的流程封裝到一個(gè)final函數(shù)中 ,并且讓子類能夠定制這個(gè)流程中的某些或者所有步驟,這就要求父類提取共用的代碼,提升代碼的復(fù)用率,同時(shí)也帶來(lái)了更好的可擴(kuò)展性。
優(yōu)點(diǎn):
1,封裝不變部分,擴(kuò)展可變部分
2,提取公共部分代碼,便于維護(hù)
缺點(diǎn):
模板方法會(huì)帶來(lái)代碼閱讀的難度,會(huì)讓用戶覺(jué)得難以理解