模板方法設計模式
在現實生活中,完成某件事是需要n多個固定步驟的。如"在淘寶網進行購物"這件事情的完成一般需要三個步驟:登錄網站、挑選商品、付款。但對於每個人幾乎都是相同的操作,但不同的地方是,每個人挑選的商品時不同的。
在軟件開發過程中同樣存在這樣的情況,某類的某個方法的實現,需要幾個固定步驟。在這些固定步驟中,對於該類的不同對象,有些步驟地實現是固定不變的,有些步驟的實現是大相徑庭的,有些步驟的實現是可便可不變的,對於這種情況,就是合適用模板方法設計模式編程。
模板方法設計模式的定義是定義了一個操作中某種算法的框架,而將一些步驟延遲到子類中。模板方法設計模式使得子類在不改變一個算法結構的前提下,對某些步驟實現個性化定義。
模板方法程序構成
在末班方法設計模式中,存在一個父類,其中包含兩類方法:模板方法與步驟方法。
模板方法:即完成模板方法的每個階段性方法,是完成模板方法的算法步驟中必須由子類完成的個性化定義。
步驟方法:即完成模板方法的每個階段性方法,每個步驟方法完成某一特定的、完成總算法的一部分功能。步驟方法有三種類型:抽象方法、最終方法與鉤子方法。
抽象方法:即要求子類必須實現的方法,是完成模板方法的算法步驟中必須由自雷完成的個性化定義。
最終方法:是子類不能重寫的方法,是若要完成模板方法的算法步驟,對於所有子類執行都一言過的步驟。
鉤子方法:是父類給出了默認實現,但子類也可以重寫的方法。
Demo:
抽象類:
publicabstractclass Shopping {
// 模板方法
publicvoid buyGoods() {
// 步驟方法
userLogin();
buy();
// 步驟方法
pay();
}
// 模板方法用戶登錄子類不能重寫的方法
privatefinalvoid userLogin() {
System.out.println("用戶登錄");
}
// 步驟方法 -抽象方法子類必須實現的方法
publicabstractvoid buy();
// 步驟方法- 鉤子方法使用銀聯卡支付
publicvoid pay() {
System.out.println("使用銀聯卡支付");
}
}
兩個實現類:
publicclass ClothesShopping extends Shopping{
@Override
publicvoid buy() {
System.out.println("購買七匹狼男裝");
}
@Override
publicvoid pay() {
System.out.println("使用支付寶付款");
}
}
publicclass ShoesShopping extends Shopping {
@Override
publicvoid buy() {
System.out.println("購買紅蜻蜓皮鞋");
}
}
測試類:
publicclass MyTest {
publicstaticvoid main(String[] args) {
Shopping shoesShopping = new ShoesShopping();
shoesShopping.buyGoods();
System.out.println("======================");
Shopping clothesShopping = new ClothesShopping();
clothesShopping.buyGoods();
}
}
運行截圖