模板方法模式是類的行爲模式。準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,而後聲明一些抽象方法來迫使子類實現剩餘的邏輯。不一樣的子類能夠以不一樣的方式實現這些抽象方法,從而對剩餘的邏輯有不一樣的實現。這就是模板方法模式的用意。算法
例如: 在現實生活中,完成某件事情是須要 n 個固定步驟的。如"在淘寶進行購物"這件事情的完成通常須要三個步驟: 登陸網站、挑選商品、 付款。但對於登陸網站與付款這兩步,每一個人幾乎都是相同的操做。但不一樣的地方是,每一個人所挑選的商品是不一樣的。 在軟件開發過程當中一樣存在這樣的狀況。某類的某個方法的實現,須要幾個固定步驟。在這些固定步驟中,對於該類的不一樣對象, 有些步驟的實現是固定不變的,有些步驟的實現是截然不同的,有些步驟的實現是可變可不變的。對於這種狀況,就適合使用模板方法設計模式編程。
基本結構:編程
在模板方法設計模式中,存在一個父類(通常是抽象的)。其中包含 兩類方法: 模板方法 和 3 種步驟方法;設計模式
結構:併發
實如今網站上購物的案例。
基本邏輯圖:分佈式
代碼: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("使用支付寶支付"); } }
測試:測試
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
關鍵詞。
免費Java高級資料須要本身領取,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高併發分佈式等教程,一共30G。
傳送門:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q