設計模式 - 模板方法模式詳解及其在Spring中的應用
阿新 • • 發佈:2020-04-23
基本介紹
模板方法模式(Template Method Pattern)也叫模板模式,它在一個抽象類中公開定義了執行它的方法的模板,它的字類可以按需重寫方法實現,但呼叫將以抽象類中定義的方式進行。
簡單來說,模板方法模式定義一個操作中的演算法的骨架,將一些步驟延遲到子類中,使得子類可以不改變一個演算法的結構,就能重新定義該演算法的某些特定步驟
模式結構
-
AbstractClass:抽象類,類中實現了模板方法,定義了演算法的骨架
-
ConcreteClass:實現類,繼承抽象類,重寫其中的抽象方法
舉例說明
編寫一個製作豆漿的程式
製作豆漿的流程:選材(黃豆) → 新增配料 → 浸泡 → 磨豆漿
要求:通過新增不同的配料,可以製作出不同口味的豆漿(除了新增配料不同,其它步驟是相同的)
1、定義一個抽象類,BaseSoyMilk:豆漿類
public abstract class BaseSoyMilk { /** * 模板方法,製作豆漿的流程 * 宣告為 final,防止子類重寫 */ protected final void make() { select(); addOther(); soak(); grind(); } private void select() { System.out.println("選擇上好的黃豆"); } protected abstract void addOther(); private void soak() { System.out.println("浸泡原材料"); } private void grind() { System.out.println("研磨成豆漿"); } }
2、建立子類,PeanutSoyMilk:花生豆漿
public class PeanutSoyMilk extends BaseSoyMilk {
@Override
protected void addOther() {
System.out.println("新增花生");
}
}
RedBeanSoyMilk:紅豆豆漿
public class RedBeanSoyMilk extends BaseSoyMilk { @Override protected void addOther() { System.out.println("新增紅豆"); } }
3、建立測試類:Client
public class Client {
@Test
public void test() {
BaseSoyMilk peanutSoyMilk = new PeanutSoyMilk();
peanutSoyMilk.make();
System.out.println("****************");
BaseSoyMilk redBeanSoyMilk = new RedBeanSoyMilk();
redBeanSoyMilk.make();
}
}
4、執行結果
選擇上好的黃豆
新增花生
浸泡原材料
研磨成豆漿
************
選擇上好的黃豆
新增紅豆
浸泡原材料
研磨成豆漿
鉤子方法
在模板方法模式的抽象類中,我們可以定義一個方法,它預設不做任何事,子類可以視情況來決定是否重寫它,該方法稱為「鉤子」。
依然以上面製作豆漿的例子來說明,如果我們什麼配料都不想加,製作純豆漿,可以使用鉤子方法對其改造。
1、為 BaseSoyMilk
類新增一個方法 isAdd
判斷是否新增其它材料
public abstract class BaseSoyMilk {
/**
* 模板方法,製作豆漿的流程
* 宣告為 final,防止子類重寫
*/
protected final void make() {
select();
if(isAdd()){
addOther();
}
soak();
grind();
}
private void select() {
System.out.println("選擇上好的黃豆");
}
protected abstract void addOther();
private void soak() {
System.out.println("浸泡原材料");
}
private void grind() {
System.out.println("研磨成豆漿");
}
protected boolean isAdd(){
return true;
}
}
2、建立一個子類 PureSoyMilk:純豆漿
public class PureSoyMilk extends BaseSoyMilk {
@Override
protected void addOther() {
}
@Override
protected boolean isAdd() {
return false;
}
}
3、測試
@Test
public void test2() {
BaseSoyMilk pureSoyMilk = new PureSoyMilk();
pureSoyMilk.make();
}
4、執行結果(現在就沒有新增其它材料的步驟了)
選擇上好的黃豆
浸泡原材料
研磨成豆漿
模式分析