1、模板方法模式介紹html
模板方法模式:定義一個操做中的算法骨架,而將一些步驟延遲到子類中。模板方法使得子類能夠不改變一個算法的結構便可重定義該算法的java
某些特定步驟。算法
核心:處理某個流程的代碼已經都具有,可是其中某個節點的代碼暫時不能肯定。所以,咱們採用工廠方法模式,將這個節點的代碼實現轉移給spring
子類完成。即:處理步驟在父類中定義好,具體的實現延遲到子類中定義。數據庫
說白了,就是將一些相同操做的代碼,封裝成一個算法的骨架。核心的部分留在子類中操做,在父類中只把那些骨架作好。設計模式
例如:框架
1.去銀行辦業務,銀行給咱們提供了一個模板就是:先取號,排對,辦理業務(核心部分咱們子類完成),給客服人員評分,完畢。ide
這裏辦理業務是屬於子類來完成的,其餘的取號,排隊,評分則是一個模板。函數
2.去餐廳吃飯,餐廳給提供的一套模板就是:先點餐,等待,吃飯(核心部分咱們子類完成),買單單元測試
這裏吃飯是屬於子類來完成的,其餘的點餐,買單則是餐廳提供給咱們客戶的一個模板。
模板方法UML圖:
2、模板方法代碼實現
這裏使用銀行辦理業務爲例
首先,定義一個模板。模板中把辦理業務用做核心部分,讓子類來實現。
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();
|
打印結果也是同樣:
取號排隊
我要存錢
反饋評分
3、總結
何時用模板方法模式?
實現一些操做時,總體步驟很固定,可是呢。就是其中一小部分容易變,這時候可使用模板方法模式,將容易變的部分抽象出來,供子類實現。
開發中常見場景:
其實,各個框架中,都有模板方法模式的影子。
數據庫訪問的封裝
Junit單元測試
servlet中關於doGet/doPost方法的調用
Hibernate中模板程序
spring中JDBCTemplate,HibernateTemplate等等
參考資料:
大話設計模式(帶目錄完整版).pdf
HEAD_FIRST設計模式(中文版).pdf
尚學堂_高淇_java300集最全視頻教程_【GOF23設計模式】