模板方法模式

前言

最近在看《Spring實戰第三版》(由於濤神說他的東西又可能要用java作。。),在第五章征服數據庫中遇到了模版方法模式。html

《JAVA與模式》之模板方法模式 —— java_my_life
模板方法模式深度解析 —— LoveLionjava

定義

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

定義一個操做中算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類能夠不改變一個算法的結構便可重定義該算法的某些特定步驟。數據庫

模板方法模式中的方法

模板方法中的方法能夠分爲兩大類:模板方法和基本方法。框架

模板方法

模板方法所表明的行爲稱爲頂級行爲,其邏輯稱爲頂級邏輯。ide

一個模板方法是定義在抽象類中的,把基本操做方法組合在一塊兒造成一個總算法或者總行爲的方法。函數

一個抽象類能夠有任意多個模板方法,而不限於一個。每一個模板方法均可以調用任意多個具體方法。.net

基本方法

基本方法能夠分爲三種:抽象方法(Abstract Method)、具體方法(Concrete Method)和鉤子方法(Hook Method)設計

  • 抽象方法 一個抽象方法由抽象類聲明,由具體子類實現(強迫具體子類實現這個步驟的具體細節)。
  • 具體方法 一個具體方法由抽象類聲明並實現,而子類並不實現或置換。
  • 鉤子方法 鉤子方法由抽象類聲明並實現,而子類會加以擴展。鉤子方法使子類能夠控制父類的行爲。

鉤子方法又能夠分爲兩類:code

  • 與具體步驟掛鉤 用以實如今不一樣條件下執行模板方法中的不一樣步驟,返回值一般爲boolean型,命名通常以is開頭,默認返回通常爲true,具體子類可重寫這個方法更改判斷條件。
  • 方法自己執行步驟 若是有一些步驟存在但不必定要執行,能夠在抽象類中實現而且一般實現體爲空。實現體爲空表示這個步驟默認什麼都不作,固然也能夠在實現體中加入一些代碼做爲默認實現。具體子類能夠重寫這些方法來覆蓋默認實現。這種鉤子方法通常以do開頭(Servlet中的doGet()、doPost())。

一個很無聊的例子:

public class Template1 {
    //這裏使用內部類只是爲了偷懶
    static abstract class Template {
        public final void exe() {
            if(isAllowSay()) {
                say();
            }
            doRun();
        }
        protected boolean isAllowSay() {
            return true;
        }
        protected void doRun(){ }
        private void say() {
            System.out.println("lalal");
        }
    }
    static class Run extends Template {
        @Override
        protected boolean isAllowSay() {
            return false;
        }
        @Override
        protected void doRun(){
            System.out.println("running...");
        }
    }
    static class Say extends Template {
        @Override
        protected void doRun(){
            System.out.println("running...");
        }
    }
    public static void main(String[] args) {
        (new Say()).exe();
        System.out.println("------");
        (new Run()).exe();
    }
}
/* OUTPUT:
lalal
running...
------
running...
*/

模板方法模式的優缺點和適用場景

優勢

  1. 在父類中形式化地定義一個算法,而由它的子類來實現細節的處理,在子類實現詳細的處理算法時並不會改變算法中步驟的執行次序。
  2. 模板方法模式是一種代碼複用技術,它在類庫設計中尤其重要,它提取了類庫中的公共行爲,將公共行爲放在父類中,而經過其子類來實現不一樣的行爲,它鼓勵咱們恰當使用繼承來實現代碼複用。
  3. 可實現一種反向控制結構,經過子類覆蓋父類的鉤子方法來決定某一特定步驟是否須要執行。
  4. 在模板方法模式中能夠經過子類來覆蓋父類的基本方法,不一樣的子類能夠提供基本方法的不一樣實現,更換和增長新的子類很方便,符合單一職責原則和開閉原則。

缺點

須要爲每個基本方法的不一樣實現提供一個子類,若是父類中可變的基本方法太多,將會致使類的個數增長,系統更加龐大,設計也更加抽象,此時,可結合橋接模式來進行設計。

適用場景

  1. 對一些複雜的算法進行分割,將其算法中固定不變的部分設計爲模板方法和父類具體方法,而一些能夠改變的細節由其子類來實現。即:一次性實現一個算法的不變部分,並將可變的行爲留給子類來實現。
  2. 各子類中公共的行爲應被提取出來並集中到一個公共父類中以免代碼重複。
  3. 須要經過子類來決定父類算法中某個步驟是否執行,實現子類對父類的反向控制。
相關文章
相關標籤/搜索