設計模式 - 模板方法

本質(zhì)

固定算法骨架

模板方法主要是通過制定規(guī)范模板,把算法步驟固定下來,至于誰來實現(xiàn),首先模板可以自己提供默認實現(xiàn),另外也可以由子類去實現(xiàn),還可以通過回調(diào)機制由其他類來實現(xiàn)。

模板方法固定算法用來約束子類行為,并在特定的擴展點上來讓子類進行功能拓展,很好的體現(xiàn)了開閉原則和里氏替換原則。首先從設計上分離變與不變,把不變的部分抽取到父類中,比如算法股價,一些公共的,固定的實現(xiàn)等。如果想拓展新的功能,由子類去實現(xiàn)可變化的步驟。另外通過切換不同的具體實現(xiàn)來切換不同的功能。

例子

Android系統(tǒng)中AsyncTask就是模板方法的具體實現(xiàn)。它固定了算法,比如按順序調(diào)用onPreExecute() , doInBackground(),onPostExecute() ?這三個方法的具體實現(xiàn)放在子類中,看源碼


AsyncTask

這三個方法基本調(diào)用順序,來看源碼部分


我們在使用AsyncTask時調(diào)用execute(Params ... params)時就是在調(diào)用這個方法 源碼


exec.execute(mFuture)里面的


所以我們從上面例子中看到這就是模板方法模式的很好的體現(xiàn)。

實例

我們的在寫Android時經(jīng)常會抽取一個父類比如 BaseActiviy . 這個類主要是做非業(yè)務實現(xiàn),處理公共的動作,固定算法。

例如我們App一般頂部會有一個Title,長度是屏幕長,高度50dp左右,會提示當前是在哪個頁面。例如


左邊是返回到上一頁面,右邊是分享,中間是提示。這種通用的Title,最好是放在父類里。現(xiàn)在講一下如何實現(xiàn)。首先看父類


注釋寫的很清楚,BaseActivity的布局也很簡單。


看一下子類現(xiàn)在的實現(xiàn)


看到了吧,按照了父類定義的固定算法股價,真正的實現(xiàn)放在了子類里。

那么想一個現(xiàn)在常見的問題,就是每個同學肯定有自己維護的一套jar的列表,也叫底層功能模塊。比如 圖片加載緩存框架(Freso,Glide,UIL..) ? ?又比如網(wǎng)絡框架(Volley,Retrofit, ?Okhttp+volley...) ? ?我們雖然做了一層實現(xiàn)的封裝,但是似乎與底層API結合的太緊密了,無法做到一鍵切換底層庫。如果想隨時隨地更換底層jar,那么模板方法模式就非常的適合,看下圖:

這樣當我們想做切換,增刪改,底層圖片支持時就異常容易了。只要抽取公共功能到第一層,讓子類自己去實現(xiàn)底層就可以了。

補充知識

什么時候使用抽象類?既要約束子類的行為,又要為子類提供公共功能 的時候使用

抽象類是用 abstract 修飾的類: 抽象類不一定含有抽象方法,但有抽象方法的一定是抽象類

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

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

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