模版方法模式

模版方法模式

定義:定義一個操作中算法的框架涂佃,而將一些步驟延遲到子類中,使得子類可以不改變算法的結(jié)構(gòu)即可重定義該算法中的某些特定步驟废菱。

事實上咖刃,模版方法是編程中一個經(jīng)常用到的模式。先來看一個例子拗军,某日任洞,程序員A拿到一個任務(wù):給定一個整數(shù)數(shù)組,把數(shù)組中的數(shù)由小到大排序发侵,然后把排序之后的結(jié)果打印出來交掏。經(jīng)過分析之后,這個任務(wù)大體上可分為兩部分刃鳄,排序和打印盅弛,打印功能好實現(xiàn),排序就有點麻煩了叔锐。但是A有辦法挪鹏,先把打印功能完成,排序功能另找人做愉烙。

abstract class AbstractSort {

    /**
     * 將數(shù)組array由小到大排序
     * @param array
     */
    protected abstract void sort(int[] array);

    public void showSortResult(int[] array){
        this.sort(array);
        System.out.print("排序結(jié)果:");
        for (int i = 0; i < array.length; i++){
            System.out.printf("%3s", array[i]);
        }
    }
}

寫完后讨盒,A找到剛畢業(yè)入職不久的同事B說:有個任務(wù),主要邏輯我已經(jīng)寫好了步责,你把剩下的邏輯實現(xiàn)一下吧返顺。于是把AbstractSort類給B,讓B寫實現(xiàn)蔓肯。B拿過來一看遂鹊,太簡單了,10分鐘搞定省核,代碼如下:

class ConcreteSort extends AbstractSort {
    @Override
    protected void sort(int[] array){
        for(int i=0; i&lt;array.length-1; i++){
            selectSort(array, i);
        }
    }

    private void selectSort(int[] array, int index) {
        int MinValue = 32767; // 最小值變量
        int indexMin = 0; // 最小值索引變量
        int Temp; // 暫存變量
        for (int i = index; i &lt; array.length; i++) {
            if (array[i] &lt; MinValue){ // 找到最小值
                MinValue = array[i]; // 儲存最小值
                indexMin = i; 
            }
        }
        Temp = array[index]; // 交換兩數(shù)值
        array[index] = array[indexMin];
        array[indexMin] = Temp;
    }
}

寫好后交給A稿辙,A拿來一運行:

public class Client {
    public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 }; // 預設(shè)數(shù)據(jù)數(shù)組
    public static void main(String[] args){
        AbstractSort s = new ConcreteSort();
        s.showSortResult(a);
    }
}

運行結(jié)果:

==排序結(jié)果: 0 1 3 4 5 7 9 10 12 32==

運行正常。行了气忠,任務(wù)完成邻储。沒錯,這就是模版方法模式旧噪。大部分剛步入職場的畢業(yè)生應該都有類似B的經(jīng)歷吨娜。一個復雜的任務(wù),由公司中的牛人們將主要的邏輯寫好淘钟,然后把那些看上去比較簡單的方法寫成抽象的宦赠,交給其他的同事去開發(fā)。這種分工方式在編程人員水平層次比較明顯的公司中經(jīng)常用到。比如一個項目組勾扭,有架構(gòu)師毡琉,高級工程師,初級工程師妙色,則一般由架構(gòu)師使用大量的接口桅滋、抽象類將整個系統(tǒng)的邏輯串起來,實現(xiàn)的編碼則根據(jù)難度的不同分別交給高級工程師和初級工程師來完成身辨。怎么樣丐谋,是不是用到過模版方法模式?

模版方法模式的結(jié)構(gòu)

模版方法模式由一個抽象類和一個(或一組)實現(xiàn)類通過繼承結(jié)構(gòu)組成煌珊,抽象類中的方法分為三種:

  • 抽象方法:父類中只聲明但不加以實現(xiàn)号俐,而是定義好規(guī)范,然后由它的子類去實現(xiàn)定庵。

  • 模版方法:由抽象類聲明并加以實現(xiàn)吏饿。一般來說,模版方法調(diào)用抽象方法來完成主要的邏輯功能洗贰,并且找岖,模版方法大多會定義為final類型,指明主要的邏輯功能在子類中不能被重寫敛滋。

  • 鉤子方法:由抽象類聲明并加以實現(xiàn)。但是子類可以去擴展兴革,子類可以通過擴展鉤子方法來影響模版方法的邏輯绎晃。

抽象類的任務(wù)是搭建邏輯的框架,通常由經(jīng)驗豐富的人員編寫杂曲,因為抽象類的好壞直接決定了程序是否穩(wěn)定性庶艾。

實現(xiàn)類用來實現(xiàn)細節(jié)。抽象類中的模版方法正是通過實現(xiàn)類擴展的方法來完成業(yè)務(wù)邏輯擎勘。只要實現(xiàn)類中的擴展方法通過了單元測試咱揍,在模版方法正確的前提下,整體功能一般不會出現(xiàn)大的錯誤棚饵。

模版方法的優(yōu)點及適用場景

容易擴展煤裙。一般來說,抽象類中的模版方法是不易反生改變的部分噪漾,而抽象方法是容易反生變化的部分硼砰,因此通過增加實現(xiàn)類一般可以很容易實現(xiàn)功能的擴展,符合開閉原則欣硼。

便于維護题翰。對于模版方法模式來說,正是由于他們的主要邏輯相同,才使用了模版方法豹障,假如不使用模版方法冯事,任由這些相同的代碼散亂的分布在不同的類中,維護起來是非常不方便的血公。

比較靈活昵仅。因為有鉤子方法,因此坞笙,子類的實現(xiàn)也可以影響父類中主邏輯的運行岩饼。但是,在靈活的同時薛夜,由于子類影響到了父類籍茧,違反了里氏替換原則,也會給程序帶來風險梯澜。這就對抽象類的設(shè)計有了更高的要求寞冯。

在多個子類擁有相同的方法,并且這些方法邏輯相同時晚伙,可以考慮使用模版方法模式吮龄。在程序的主框架相同,細節(jié)不同的場合下咆疗,也比較適合使用這種模式漓帚。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市午磁,隨后出現(xiàn)的幾起案子尝抖,更是在濱河造成了極大的恐慌,老刑警劉巖迅皇,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昧辽,死亡現(xiàn)場離奇詭異,居然都是意外死亡登颓,警方通過查閱死者的電腦和手機搅荞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來框咙,“玉大人咕痛,你說我怎么就攤上這事”饽停” “怎么了暇检?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長婉称。 經(jīng)常有香客問我块仆,道長构蹬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任悔据,我火速辦了婚禮庄敛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘科汗。我一直安慰自己藻烤,他們只是感情好,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布头滔。 她就那樣靜靜地躺著怖亭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坤检。 梳的紋絲不亂的頭發(fā)上兴猩,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音早歇,去河邊找鬼倾芝。 笑死箭跳,一個胖子當著我的面吹牛晨另,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谱姓,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼借尿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屉来?” 一聲冷哼從身側(cè)響起垛玻,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奶躯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亿驾,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡嘹黔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了莫瞬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片儡蔓。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖疼邀,靈堂內(nèi)的尸體忽然破棺而出喂江,到底是詐尸還是另有隱情,我是刑警寧澤旁振,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布获询,位于F島的核電站涨岁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吉嚣。R本人自食惡果不足惜梢薪,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尝哆。 院中可真熱鬧秉撇,春花似錦、人聲如沸秋泄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恒序。三九已至瘦麸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奸焙,已是汗流浹背瞎暑。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留与帆,地道東北人了赌。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像玄糟,于是被迫代替她去往敵國和親勿她。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容