一、模板方法模式介紹
模板方法模式:定義一個操作中的算法骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的
某些特定步驟。
核心:處理某個流程的代碼已經都具備,但是其中某個節點的代碼暫時不能確定。因此,我們采用工廠方法模式,將這個節點的代碼實現轉移給
子類完成。即:處理步驟在父類中定義好,具體的實現延遲到子類中定義。
說白了,就是將一些相同操作的代碼,封裝成一個算法的骨架。核心的部分留在子類中操作,在父類中只把那些骨架做好。
例如:
1.去銀行辦業務,銀行給我們提供了一個模板就是:先取號,排對,辦理業務(核心部分我們子類完成),給客服人員評分,完畢。
這里辦理業務是屬於子類來完成的,其他的取號,排隊,評分則是一個模板。
2.去餐廳吃飯,餐廳給提供的一套模板就是:先點餐,等待,吃飯(核心部分我們子類完成),買單
這里吃飯是屬於子類來完成的,其他的點餐,買單則是餐廳提供給我們客戶的一個模板。
模板方法UML圖:
二、模板方法代碼實現
這里使用銀行辦理業務為例
首先,定義一個模板。模板中把辦理業務用作核心部分,讓子類來實現。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
//模板抽象方法
public
abstract
class
BankTemplateMethod {
//模板方法中其他業務邏輯
//1.取號排隊
public
void
takeNumber(){
System.out.println(
"取號排隊"
);
}
//2.辦理具體的業務:這里留給子類來實現!!!
public
abstract
void
transact();
//3.給客服評分
public
void
evaluate(){
System.out.println(
"反饋評分"
);
}
//模板方法
public
final
void
process(){
this
.takeNumber();
this
.transact();
//這里則是具體的模板方法函數
this
.evaluate();
}
}
|
然后定義具體的模板方法的子類
1
2
3
4
5
6
7
|
//子類實現模板方法:取款
public
class
DrawMoney
extends
BankTemplateMethod{
@Override
public
void
transact() {
System.out.println(
"我要取款"
);
}
}
|
客戶端測試
1
2
3
|
//定義子類方式實現模板方法
BankTemplateMethod template =
new
DrawMoney();
template.process();
|
打印結果:
取號排隊
我要取款
反饋評分
當然,也可以使用一個匿名內部類的方式來實現這種模板方法。
1
2
3
4
5
6
7
8
|
BankTemplateMethod template1 =
new
BankTemplateMethod() {
//這里使用匿名內部類實現:只需實現具體業務部分,其他部分則使用模板方法定義好的骨架
@Override
public
void
transact() {
System.out.println(
"我要存錢"
);
}
};
template1.process();
|
打印結果也是一樣:
取號排隊
我要存錢
反饋評分
三、總結
什么時候用模板方法模式?
實現一些操作時,整體步驟很固定,但是呢。就是其中一小部分容易變,這時候可以使用模板方法模式,將容易變的部分抽象出來,供子類實現。
開發中常見場景:
其實,各個框架中,都有模板方法模式的影子。
數據庫訪問的封裝
Junit單元測試
servlet中關於doGet/doPost方法的調用
Hibernate中模板程序
spring中JDBCTemplate,HibernateTemplate等等
參考資料:
大話設計模式(帶目錄完整版).pdf
HEAD_FIRST設計模式(中文版).pdf
尚學堂_高淇_java300集最全視頻教程_【GOF23設計模式】