當(dāng)一些執(zhí)行的流程是固定的身辨,但是執(zhí)行的具體細(xì)節(jié)不一樣,這時候就需要用到模板方法模式
定義:
定義一個操作中的算法的框架芍碧,而將一些步驟延遲到子類中實(shí)現(xiàn)煌珊,使得子類在不改變算法的結(jié)構(gòu)的情況下,又能具體的定義某個算法實(shí)現(xiàn)的細(xì)節(jié)泌豆。
實(shí)現(xiàn)起來很簡單定庵,就是有一個父類,比如里面定義了stepOne()、stepTwo()洗贰、stepThree()等方法找岖,然后有一個execute()方法(可以定義為final避免子類覆蓋),execute里面按照需要的順序調(diào)用了上面的這些方法敛滋。
而在子類中许布,如果某個方法比如stepTwo,不同的子類實(shí)現(xiàn)方式一樣绎晃,我們在子類中去覆蓋重寫就好了蜜唾。
例子:
有一個父類 AbstractComputer,開機(jī)方法startUp庶艾,里面按照順序調(diào)用了powerOn袁余、checkHardware、loadOS咱揍、login方法颖榜。
我們知道,個人計算機(jī)和軍用計算機(jī)在checkHardware煤裙、loadOS掩完、login方法具體實(shí)現(xiàn)的細(xì)節(jié)可能是不一樣的。
我們創(chuàng)建兩個子類CoderComputer和MilitaryComputer硼砰,然后覆蓋具體方法且蓬。
Android源碼用的模板方法模式
AsyncTask其實(shí)就是一個典型的模板方法,調(diào)用execute后题翰,會一次執(zhí)行onPreExecute恶阴、doInBackground、onPostExecute也可以通過onProgressUpdate來更新進(jìn)度豹障。
這幾個方法的調(diào)用流程和進(jìn)程的切換是Android源碼中定義好了的冯事,而這幾個方法的具體實(shí)現(xiàn)需要用戶自己去實(shí)現(xiàn)。
總結(jié)
優(yōu)點(diǎn):
封裝了不變的部分沼填,擴(kuò)展可變部分
提取公共部分代碼桅咆,便于維護(hù)
缺點(diǎn):
可能帶來代碼閱讀的難度,有些地方用戶難于理解