設計模式---模板方法模式

2022-10-28 06:00:38

簡述

提取演演算法中不變的部分封裝成方法,變化的部分延遲到子類

延遲到子類
這個說法在學習設計模式的時候經常出現,實際就是利用多型在子類中重寫方法,使得實行時根據範例的型別呼叫不同的方法。

話不多說,看個案例。

優化案例

最初版v0

連線資料庫我們有很多種方式,JDBC、JNDI、ODBC等等。下面是不使用設計模式模擬使用三種方式實現連線資料庫。

public class Client {
    public static void main(String[] args) {
        JDBC jdbc = new JDBC();
        jdbc.execute(); // 使用jdbc連線資料庫
        JNDI jndi = new JNDI();
        jndi.execute(); // 使用jndi連線資料庫
        ODBC odbc = new ODBC();
        odbc.execute(); // 使用odbc連線資料庫
    }
}

public class JDBC {
    public void execute() {
        System.out.println("讀取資料庫連結組態檔");
        System.out.println("使用JDBC建立資料庫連結。。。");
        System.out.println("資料庫連結成功");
    }
}

public class ODBC {
    public void execute() {
        System.out.println("讀取資料庫連結組態檔");
        System.out.println("使用ODBC建立資料庫連結。。。");
        System.out.println("資料庫連結成功");
    }
}

public class JNDI {
    public void execute() {
        System.out.println("讀取資料庫連結組態檔");
        System.out.println("使用JNDI建立資料庫連結。。。");
        System.out.println("資料庫連結成功");
    }
}

可以看出以上程式碼中有兩處不變的程式碼 --> System.out.println("讀取資料庫連結組態檔")System.out.println("資料庫連結成功")。這兩處程式碼分別在三個類中重複了三次。案例中只有兩行程式碼,問題不大,但是真實專案中可能會存在幾百行程式碼完全相同但是到處都有的情況。為了解決這個問題,提高我們開發的效率,並且也能提高bug篩查的效率,我們可以使用模板方法模式。詳細請看以下案例。

提高bug篩查的效率的原因
如果幾百行的程式碼重複出現在十幾個或者幾十個不同的類中,當bug出現在一處程式碼時,為了確保系統不再出現同樣的錯誤,需要把剩餘所有相同的程式碼都檢查一遍,這無疑增加了後期維護的成本。
而使用模板方法模式則可以省去很多花在這類雜活上的時間。

修改版v1

public class Client {
    public static void main(String[] args) {
        JDBC jdbc = new JDBC();
        jdbc.templateExecute(); // 使用jdbc連線資料庫
        JNDI jndi = new JNDI();
        jndi.templateExecute(); // 使用jndi連線資料庫
        ODBC odbc = new ODBC();
        odbc.templateExecute(); // 使用odbc連線資料庫
    }
}

public abstract class DBConnection {
    // 模板方法
    public void templateExecute() {
        System.out.println("讀取資料庫連結組態檔"); // 不變的程式碼1
        this.execute();
        System.out.println("資料庫連結成功"); // 不變的程式碼2
    }

    public abstract void execute();
}

public class JDBC extends DBConnection {
    public void execute() {
        System.out.println("使用JDBC建立資料庫連結。。。");
    }
}

public class ODBC extends DBConnection {
    public void execute() {
        System.out.println("使用ODBC建立資料庫連結。。。");
    }
}

public class JNDI extends DBConnection {
    public void execute() {
        System.out.println("使用JNDI建立資料庫連結。。。");
    }
}

就增加一個抽象類和一個模板方法就解決了程式碼重複的問題。現在重複的程式碼就兩行,所以效果不明顯,如果是幾百行,那效果立竿見影,而且模板方法模式也沒有什麼複雜的理念,簡單易懂。悄悄告訴你,模板方法模式在各種框架中都是非常常見的。

總結

優點

  • 可以減少專案中大量重複程式碼。
  • 設計思想簡單(就繼承+多型),易懂。
  • 實現簡單,只需要增加一個抽象類,增加一個模板方法即可。

缺點

  • 說實話,個人覺得沒啥缺點。要是一個模板方法模式也能增加程式碼的閱讀難度的話,還是轉行比較好哈哈哈。

適用場景

  • 任何可以明確分清變化與不變化的程式碼。