模板方法模式是類的行爲模式。準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,而後聲明一些抽象方法來迫使子類實現剩餘的邏輯。不一樣的子類能夠以不一樣的方式實現這些抽象方法,從而對剩餘的邏輯有不一樣的實現。這就是模板方法模式的用意。算法
例如: 在現實生活中,完成某件事情是須要 n 個固定步驟的。如"在淘寶進行購物"這件事情的完成通常須要三個步驟: 登陸網站、挑選商品、 付款。但對於登陸網站與付款這兩步,每一個人幾乎都是相同的操做。但不一樣的地方是,每一個人所挑選的商品是不一樣的。 在軟件開發過程當中一樣存在這樣的狀況。某類的某個方法的實現,須要幾個固定步驟。在這些固定步驟中,對於該類的不一樣對象, 有些步驟的實現是固定不變的,有些步驟的實現是截然不同的,有些步驟的實現是可變可不變的。對於這種狀況,就適合使用模板方法設計模式編程。
基本結構:編程
在模板方法設計模式中,存在一個父類(通常是抽象的)。其中包含 兩類方法: 模板方法 和 3 種步驟方法;設計模式
結構:bash
實如今網站上購物的案例。
基本邏輯圖:ide
代碼:函數
首先看Shopping
類:測試
public abstract class Shopping {
// 模板方法
public void buyGoods(){
useLogin(); //固定的方法,子類不能重寫
buy(); //抽象方法,子類必須實現
pay(); //鉤子方法(hook),子類能夠重寫
}
// 固定方法(最終方法)
public final void useLogin() {
System.out.println("用戶登陸");
}
//抽象方法
public abstract void buy();
// 鉤子方法
public void pay(){
System.out.println("使用銀聯支付");
}
}複製代碼
而後是兩個子類:網站
public class ShoesShopping extends Shopping {
@Override
public void buy() {
System.out.println("購買Nike鞋子!!!!");
}
}
public class ClothesShopping extends Shopping {
@Override
public void buy() {
System.out.println("購買海瀾之家男裝!!!!!");
}
// 重寫了鉤子方法
@Override
public void pay() {
System.out.println("使用支付寶支付");
}
}複製代碼
測試:spa
public class MyTest {
public static void main(String[] args){
Shopping shoesShopping = new ShoesShopping();
shoesShopping.buyGoods();
System.out.println("-----------------------");
Shopping clothesShopping = new ClothesShopping();
clothesShopping.buyGoods();
}
}複製代碼
輸出:設計
用戶登陸
購買Nike鞋子!!!!
使用銀聯支付
-----------------------
用戶登陸
購買海瀾之家男裝!!!!!
使用支付寶支付複製代碼
有時候爲了防止惡意操做,模板方法也會加上 final
關鍵詞。