結合案例深刻解析模板方法設計模式

1、基本概念

模板方法模式是類的行爲模式。準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,而後聲明一些抽象方法來迫使子類實現剩餘的邏輯。不一樣的子類能夠以不一樣的方式實現這些抽象方法,從而對剩餘的邏輯有不一樣的實現。這就是模板方法模式的用意。算法

例如: 在現實生活中,完成某件事情是須要 n 個固定步驟的。如"在淘寶進行購物"這件事情的完成通常須要三個步驟: 登陸網站、挑選商品、 付款。但對於登陸網站與付款這兩步,每一個人幾乎都是相同的操做。但不一樣的地方是,每一個人所挑選的商品是不一樣的。 在軟件開發過程當中一樣存在這樣的狀況。某類的某個方法的實現,須要幾個固定步驟。在這些固定步驟中,對於該類的不一樣對象, 有些步驟的實現是固定不變的,有些步驟的實現是截然不同的,有些步驟的實現是可變可不變的。對於這種狀況,就適合使用模板方法設計模式編程。

2、結構

基本結構:編程

在模板方法設計模式中,存在一個父類(通常是抽象的)。其中包含 兩類方法: 模板方法 和 3 種步驟方法;設計模式

  • 模板方法: 即實現某種算法的方法步驟。這些步驟都是調用的步驟方法實現的。
  • 步驟方法:即完成模板方法的每一個階段性方法。
    • 抽象方法: 子類必須實現的方法。即子類的個性化定義;
    • 最終方法(固定方法): 子類不能重寫的方法,即全部子類都要作的步驟;
    • 鉤子方法: 父類給了默認實現,子類能夠重寫,也能夠不重寫的方法;


結構:bash



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("使用支付寶支付");
    }
}複製代碼

測試: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鞋子!!!!
使用銀聯支付
-----------------------
用戶登陸
購買海瀾之家男裝!!!!!
使用支付寶支付複製代碼

4、總結

有時候爲了防止惡意操做,模板方法也會加上 final 關鍵詞。

相關文章
相關標籤/搜索