Android開發(fā)之模板方法模式

設(shè)計模式.png

前言

其實模板方法模式我們經(jīng)常使用,而且在我看來,可能是23個設(shè)計模式中最簡單的一個了,但是可能大家都忘記概念了,此偏博文作為總結(jié)回顧。

畢竟,總結(jié),永遠(yuǎn)都是沒錯的。

在軟件開發(fā)中,我們經(jīng)常會遇到知道大概要做什么事情,但是細(xì)節(jié)沒定,或者說,確定了大體的樣子后,其中某個步驟可能有多種情況,多種寫法,甚至是容易經(jīng)常更換。

這個時候,我們的模板方法模式便上場了。而且在源碼庫中,使用頻率是極高的。

正題

  • 定義

定義一個操作中的算法框架,而將一些步驟延遲道子類中,使得子類可以不改變一個算法的結(jié)構(gòu)即可重新定義該算法的某些特定步驟。(其實,說清楚了就是抽象類的良好使用)
注意與策略模式的不同是,策略模式的主要思想是:使不同的算法可以被相互替換,而不影響客戶端的使用。

  • 使用場景
  1. 對一些復(fù)雜的算法進行分割,將其算法中固定不變的部分設(shè)計為模板方法和父類具體方法,而一些可以改變的細(xì)節(jié)由其子類來實現(xiàn)。即:一次性實現(xiàn)一個算法的不變部分,并將可變的行為留給子類來實現(xiàn)。

  2. 各子類中公共的行為應(yīng)被提取出來并集中到一個公共父類中以避免代碼重復(fù)。

  3. 需要通過子類來決定父類算法中某個步驟是否執(zhí)行,實現(xiàn)子類對父類的反向控制。

  • 使用方法

其實就相當(dāng)于是抽象類的使用,而其中的關(guān)鍵就是抽象, 抽象出什么樣的方法給子類去實現(xiàn),這才是核心。

來個demo吧

abstract class AbstractClass {
    //模板方法
    public void TemplateMethod() {
        PrimitiveOperation1();
        PrimitiveOperation2();
        PrimitiveOperation3();
    }

    //基本方法—具體方法
    public void PrimitiveOperation1() {
        //實現(xiàn)代碼
    }

    //基本方法—抽象方法
    public abstract void PrimitiveOperation2();

    //基本方法—鉤子方法
    public void PrimitiveOperation3() {
    }
}

class ImplClassA extends AbstractClass{

    @Override
    public void PrimitiveOperation2() {
        //具體實現(xiàn)
    }
}

  • 優(yōu)缺點

優(yōu)點

模板方法模式的主要優(yōu)點如下:

(1) 在父類中形式化地定義一個算法,而由它的子類來實現(xiàn)細(xì)節(jié)的處理,在子類實現(xiàn)詳細(xì)的處理算法時并不會改變算法中步驟的執(zhí)行次序。

(2) 模板方法模式是一種代碼復(fù)用技術(shù),它在類庫設(shè)計中尤為重要,它提取了類庫中的公共行為,將公共行為放在父類中,而通過其子類來實現(xiàn)不同的行為,它鼓勵我們恰當(dāng)使用繼承來實現(xiàn)代碼復(fù)用。

(3) 可實現(xiàn)一種反向控制結(jié)構(gòu),通過子類覆蓋父類的鉤子方法來決定某一特定步驟是否需要執(zhí)行。

(4) 在模板方法模式中可以通過子類來覆蓋父類的基本方法,不同的子類可以提供基本方法的不同實現(xiàn),更換和增加新的子類很方便,符合單一職責(zé)原則和開閉原則。

缺點

模板方法模式的主要缺點如下:

需要為每一個基本方法的不同實現(xiàn)提供一個子類,如果父類中可變的基本方法太多,將會導(dǎo)致類的個數(shù)增加,系統(tǒng)更加龐大,設(shè)計也更加抽象。

源碼下的模板方法模式

很多很多的等待我們實現(xiàn)的抽象類都使用了該模式。比較常見的是 AsyncTask,其實Activity也是,我們在各大生命周期中執(zhí)行自己的細(xì)節(jié)代碼,而那些生命周期回調(diào)就可以稱之為鉤子方法。

    private AsyncTask task = new AsyncTask() {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Object doInBackground(Object[] params) {
            return null;
        }

        @Override
        protected void onPostExecute(Object o) {
            super.onPostExecute(o);
        }
    };
    

我們可以看到,onPreExecute,doInBackground,onPostExecute這些都是模板方法父類為我們提供的讓我們寫具體細(xì)節(jié)的代碼,而至于這個異步任務(wù)是怎么執(zhí)行的,怎么挨個調(diào)用的,由模板方法統(tǒng)一處理。


謝謝大家閱讀,如有幫助,來個喜歡或者關(guān)注吧!


本文作者:Anderson/Jerey_Jobs

博客地址 : 夏敏的博客/Anderson大碼渣/Jerey_Jobs

簡書地址 : Anderson大碼渣

CSDN地址 : Jerey_Jobs的專欄

github地址 : Jerey_Jobs

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 場景問題# 1.1 登錄控制## 幾乎所有的應(yīng)用系統(tǒng),都需要系統(tǒng)登錄控制的功能,有些系統(tǒng)甚至有多個登錄控制的功...
    七寸知架構(gòu)閱讀 2,052評論 3 53
  • 設(shè)計模式匯總 一、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 4,094評論 1 15
  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是模板方法模式 模式的結(jié)構(gòu) 代碼示例 優(yōu)點和缺點 適用環(huán)境 模式應(yīng)用 一、引言 ...
    w1992wishes閱讀 907評論 0 3
  • 設(shè)計模式基本原則 開放-封閉原則(OCP),是說軟件實體(類、模塊、函數(shù)等等)應(yīng)該可以拓展,但是不可修改。開-閉原...
    西山薄涼閱讀 4,083評論 3 14
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,754評論 18 399

友情鏈接更多精彩內(nèi)容