本質(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)放在子類中,看源碼

這三個方法基本調(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 修飾的類: 抽象類不一定含有抽象方法,但有抽象方法的一定是抽象類