定義
模板方法模式(Template Method Pattern):定義一個(gè)操作中算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
通俗理解
當(dāng)我們在寫ppt的時(shí)候,我們第一個(gè)想到的就是上網(wǎng)找一個(gè)模板,然后用這個(gè)模板,把ppt弄得漂亮一些。這里的模板就是我們今天要講到的模板模式,它是一種用繼承來復(fù)用代碼的方式,將通用的方法放到父類當(dāng)中,然后彼此不同的方法方到子類上面。就像寫ppt一樣,每一個(gè)人寫ppt的內(nèi)容都是不一樣的,但是外觀,一些邊框字體都是一樣的,這樣我們就可以采用下載網(wǎng)上的ppt模板,套上自己的內(nèi)容去做ppt,這樣就可以很快很高效地完成ppt的書寫了。因此這里的ppt模板就像父類,而自己的內(nèi)容就像子類,子類能用父類的設(shè)計(jì),就實(shí)現(xiàn)了復(fù)用。
示例
用模板寫ppt。
渣渣程序
PPT類
public class PPT1 {
public void outlook() {
System.out.println("選擇模板");
}
public void writePPT() {
System.out.println("寫PPT1");
}
}
// PPT2類似,省略
程序入口
public class Main {
static PPT1 ppt1 = new PPT1();
static PPT2 ppt2 = new PPT2();
public static void main(String[] args) {
ppt1.outlook();
ppt1.writePPT();
ppt2.outlook();
ppt2.writePPT();
}
}
//選擇模板
//寫PPT1
//選擇模板
//寫PPT2
問題就是,outlook方法,我們寫了兩遍,復(fù)制,黏貼代碼都是罪過,千萬不要當(dāng)CV程序員,解決辦法就是把他們提到父類里面。
優(yōu)化
類圖
image
程序
PPT抽象類和實(shí)現(xiàn)
public abstract class PPT {
public void outlook() {
System.out.println("選擇模板");
}
public abstract void writePPT();
}
public class PPT1 extends PPT{
public void writePPT() {
System.out.println("寫PPT1");
}
}
// PPT2類似,省略
程序入口
public class Main {
static PPT ppt1 = new PPT1();
static PPT ppt2 = new PPT2();
public static void main(String[] args) {
ppt1.outlook();
ppt1.writePPT();
ppt2.outlook();
ppt2.writePPT();
}
}
//選擇模板
//寫PPT1
//選擇模板
//寫PPT2
除了在抽象類當(dāng)中定義具體的方法和抽象的方法外,還可以定義空方法和鉤子方法。
- 空方法:在方法體上不做任何的操作;
- 鉤子方法:返回為boolean的方法,用來確定是否運(yùn)行某個(gè)代碼片段,子類中確定是否運(yùn)行父類的某些片段。
優(yōu)點(diǎn)
- 代碼復(fù)用,將子類中復(fù)用的代碼都放到父類當(dāng)中去;
- 擴(kuò)展性強(qiáng)。
缺點(diǎn)
- 具體方法類比較多;
- 要知道哪些是共用的哪些不是,不然這種復(fù)用會變得很糟糕。
應(yīng)用場景
- 幾個(gè)類中的代碼片段反復(fù)出現(xiàn)的,(一個(gè)類中反復(fù)出現(xiàn)的可以提到一個(gè)方法中);
- 子類有統(tǒng)一的操作步驟與過程;
- 子類有具體的操作細(xì)節(jié);
代碼
吐槽
幾個(gè)類中的代碼片段反復(fù)出現(xiàn)的,提到父類當(dāng)中。