您好,登錄后才能下訂單哦!
文章首發(fā):
行為型模式:模板方法
十一大行為型模式之一:模板方法。
姓名 :模板方法
英文名 :Template Method Pattern
價(jià)值觀 :在我的掌控下,任由你發(fā)揮
個(gè)人介紹 :
Define the skeleton of an algorithm in an operation,deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
定義一個(gè)操作中的算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
(來自《設(shè)計(jì)模式之禪》)
解釋一下上面的介紹,意思是由父類來定義框架,讓子類來具體實(shí)現(xiàn)。
剛過完春節(jié),大家都買新鞋了么?今天要講的故事和鞋子有關(guān)。一雙鞋子從表面來看,由鞋底、鞋墊、鞋面、鞋帶組成,同一系列的鞋子這幾個(gè)部分都是一樣的,用同樣的材料做出來,不同系列的鞋子就大相徑庭了。根據(jù)模板方法模式,組裝一雙鞋子的制造過程可以歸并為固定的框架,至于用什么材料,那由每個(gè)系列的鞋子去具體實(shí)現(xiàn)。我們先看定義組裝鞋子的框架代碼。
/**
* 定義鞋子制造的工序框架
*/
abstract class ShoeInstallTemplate {
public abstract void installSole();
public abstract void installInsole();
public abstract void installVamp();
public abstract void installShoelace();
public void installShot(){
System.out.println("組裝一雙鞋,步驟如下:");
// 組裝鞋底
installSole();
// 組裝鞋墊
installInsole();
// 組裝鞋面
installVamp();
// 組裝鞋帶
installShoelace();
}
}
定義了一個(gè)組裝鞋子框架的抽象類 ShoeInstallTemplate,里面有 4 個(gè)工序未具體實(shí)現(xiàn),由鞋子制造商去實(shí)現(xiàn),因?yàn)橹挥行又圃焐滩胖佬右檬裁床牧蟻碜觥?br/>下面舉 2 個(gè)比較出名的鞋子:Adidas 的 Boost 系列和 Nike 的 Jordan 系列。下面分別實(shí)現(xiàn)這 2 個(gè)系列鞋子的制造代碼。
/**
* Adidas Boost 鞋制造
*/
class AdidasBoostShoeInstall extends ShoeInstallTemplate {
@Override
public void installSole() {
System.out.println("組裝白色 Boost 鞋底");
}
@Override
public void installInsole() {
System.out.println("組裝黑色 Boost 鞋墊");
}
@Override
public void installVamp() {
System.out.println("組裝黑色 Boost 鞋面");
}
@Override
public void installShoelace() {
System.out.println("組裝黑色 Boost 鞋帶");
}
}
/**
* Nike Jordan 鞋制造
*/
class NikeJordanShoeInstall extends ShoeInstallTemplate {
@Override
public void installSole() {
System.out.println("組裝黑色 Jordan 鞋底");
}
@Override
public void installInsole() {
System.out.println("組裝黑色 Jordan 鞋墊");
}
@Override
public void installVamp() {
System.out.println("組裝紅色 Jordan 鞋面");
}
@Override
public void installShoelace() {
System.out.println("組裝紅色 Jordan 鞋帶");
}
}
實(shí)現(xiàn)了制造商制造鞋子的代碼之后,我們通過代碼測(cè)試怎么制造 Boost 和 Jordan 鞋子。
public class TemplateMethodTest {
public static void main(String[] args) {
ShoeInstallTemplate adidasBoost = new AdidasBoostShoeInstall();
adidasBoost.installShot();
ShoeInstallTemplate nikeJordan = new NikeJordanShoeInstall();
nikeJordan.installShot();
}
}
打印結(jié)果:
組裝一雙鞋,步驟如下:
組裝白色 Boost 鞋底
組裝黑色 Boost 鞋墊
組裝黑色 Boost 鞋面
組裝黑色 Boost 鞋帶
組裝一雙鞋,步驟如下:
組裝黑色 Jordan 鞋底
組裝黑色 Jordan 鞋墊
組裝紅色 Jordan 鞋面
組裝紅色 Jordan 鞋帶
模板方法模式就這么簡(jiǎn)單。是不是掌握了?
代碼:
Template Method Pattern
模板方法是一個(gè)比較實(shí)用的模式,為什么說實(shí)用呢?舉個(gè)現(xiàn)實(shí)的例子,Java 能有如今的發(fā)展,離不開各大開源框架,比如 Dubbo,有看過源碼的朋友就知道,里面大量代碼運(yùn)用了模板方法設(shè)計(jì)模式,為什么 Dubbo 可以支持很多種注冊(cè)中心?其實(shí)本質(zhì)就是用了模板方法設(shè)計(jì)模式,使得可以擴(kuò)展多種注冊(cè)中心。掌握好模板方法,對(duì)讀源碼有非常大的幫助,很多人包括我在內(nèi),在剛開始閱讀源碼的時(shí)候,有相當(dāng)長(zhǎng)的一段時(shí)間懷疑人生,怎么這些代碼那么繞?調(diào)來調(diào)去的。當(dāng)你了解了常用的設(shè)計(jì)模式之后,看源代碼就可以直截了當(dāng)?shù)闹朗怯檬裁丛O(shè)計(jì)模式,為什么用這個(gè)設(shè)計(jì)模式?原來是為了什么什么。。。有了這層思考,就像有一條線將以前散落在各地的知識(shí)點(diǎn)連接起來,成了可以推敲的知識(shí)。
推薦閱讀:
單一職責(zé)原則(方法:修改名字還是密碼?接口:洗碗、買菜還是倒垃圾?類:注冊(cè)、登錄和注銷)
里氏替換原則(我兒來自新東方烹飪)
依賴倒置原則(摳門的飯店老板)
接口隔離原則(小伙子的作坊)
迪米特法則(手機(jī)上看電子書)
開閉原則(社保這點(diǎn)事)
創(chuàng)建型模式:?jiǎn)卫J剑ㄐ∶骶椭挥?1 輛車)
創(chuàng)建型模式:工廠方法(小明家的車庫)
創(chuàng)建型模式:抽象工廠(寶馬車就得用寶馬輪胎和寶馬方向盤)
創(chuàng)建型模式:建造者模式(湯這么煲)
創(chuàng)建型模式:原型模式(復(fù)印書籍)
公眾號(hào)后臺(tái)回復(fù)『大禮包』獲取 Java、Python、IOS 等教程
加個(gè)人微信備注『教程』獲取架構(gòu)師、機(jī)器學(xué)習(xí)等教程
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。