Android編程設(shè)計(jì)模式之模板方法模式詳解
本文實(shí)例講述了Android編程設(shè)計(jì)模式之模板方法模式。分享給大家供大家參考,具體如下:
一、介紹
在面向?qū)ο箝_(kāi)發(fā)過(guò)程中,通常會(huì)遇到這樣的一個(gè)問(wèn)題,我們知道一個(gè)算法所需的關(guān)鍵步驟,并確定了這些步驟的執(zhí)行順序,但是,某些步驟的具體實(shí)現(xiàn)是未知的,或者說(shuō)某些步驟的實(shí)現(xiàn)是會(huì)隨著環(huán)境的變化而改變的,例如,執(zhí)行程序的流程大致如下:
1.檢查代碼的正確性;
2.鏈接相關(guān)的類(lèi)庫(kù);
3.編譯相關(guān)代碼;
4.執(zhí)行程序。
對(duì)于不同的程序設(shè)計(jì)語(yǔ)言,上述4個(gè)步驟都是不一樣的,但是,它們的執(zhí)行流程是固定的,這類(lèi)問(wèn)題的解決方案就是我們本章要講的模板方法模式。
二、定義
定義一個(gè)操作中的算法的框架,而將一些步驟延遲到子類(lèi)中,使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
三、使用場(chǎng)景
多個(gè)子類(lèi)有公有的方法,并且邏輯基本相同時(shí)。
重要、復(fù)雜的算法,可以把核心算法設(shè)計(jì)為模板方法,周邊的相關(guān)細(xì)節(jié)功能則由各個(gè)子類(lèi)實(shí)現(xiàn)。
重構(gòu)時(shí),模板方法模式是一個(gè)經(jīng)常使用的模式,把相同的代碼抽取到父類(lèi)中,然后通過(guò)鉤子函數(shù)約束其行為。
四、模板方法模式的UML類(lèi)圖
UML類(lèi)圖:
角色介紹:
AbstractClass:抽象類(lèi),定義了一套算法框架。
ConcreteClass1:具體實(shí)現(xiàn)類(lèi)1。
ConcreteClass2:具體實(shí)現(xiàn)類(lèi)2。
五、簡(jiǎn)單示例
模板方法實(shí)際上是封裝一個(gè)固定流程,就像是一套執(zhí)行模板一樣,第一步該做什么,第二步該做什么都已經(jīng)在抽象類(lèi)中定義好。而子類(lèi)可以有不同的算法實(shí)現(xiàn),在框架不被修改的情況下實(shí)現(xiàn)某些步驟的算法替換,下面以打開(kāi)計(jì)算機(jī)這個(gè)動(dòng)作來(lái)簡(jiǎn)單演示一下模板方法。打開(kāi)計(jì)算機(jī)的整個(gè)過(guò)程都是相對(duì)固定的,首先啟動(dòng)計(jì)算機(jī)電源,計(jì)算機(jī)檢測(cè)自身狀態(tài)沒(méi)有問(wèn)題時(shí)將進(jìn)入操作系統(tǒng),對(duì)用戶(hù)進(jìn)行驗(yàn)證之后即可登錄計(jì)算機(jī),下面我們使用模板方法來(lái)模擬一下這個(gè)過(guò)程:
抽象的 Computer
/** * 抽象的 Computer */ public abstract class AbstractComputer { //下面是抽象方法,子類(lèi)可以覆蓋,不允許外部直接調(diào)用這些方法,所以用protected /** * 開(kāi)啟電源 */ protected abstract void powerOn(); /** * 檢查硬件 */ protected abstract void checkHardware(); /** * 載入操作系統(tǒng) */ protected abstract void loadOS(); /** * 登錄 */ protected abstract void login(); //下面是鉤子方法,聲明并實(shí)現(xiàn) /** * 是否需要登錄 * * @return true為需要登錄 */ protected boolean isLogin(){ return true; } //下面是模板方法,定義為final,子類(lèi)不能覆蓋此方法 /** * 啟動(dòng)計(jì)算機(jī)方法,步驟為開(kāi)啟電源、系統(tǒng)檢查、加載系統(tǒng)、檢查是否登錄。 */ public final void startUp(){ System.out.println("--------開(kāi)機(jī) START--------"); powerOn(); checkHardware(); loadOS(); if(isLogin()){ login(); } System.out.println("-------- 開(kāi)機(jī) END --------"); } }
Windows系統(tǒng)電腦(不需登錄):
/** * Windows系統(tǒng)電腦 */ public class WindowsComputer extends AbstractComputer{ @Override protected void powerOn() { System.out.println("Windows電腦開(kāi)啟電源"); } @Override protected void checkHardware() { System.out.println("Windows電腦檢查硬件"); } @Override protected void loadOS() { System.out.println("Windows電腦載入操作系統(tǒng)"); } @Override protected void login() { } @Override protected boolean isLogin() { return false;//返回false,不需登錄 } }
Mac系統(tǒng)電腦(需登錄):
/** * Mac系統(tǒng)電腦 */ public class MacComputer extends AbstractComputer{ @Override protected void powerOn() { System.out.println("Mac電腦開(kāi)啟電源"); } @Override protected void checkHardware() { System.out.println("Mac電腦檢查硬件"); } @Override protected void loadOS() { System.out.println("Mac電腦載入操作系統(tǒng)"); } @Override protected void login() { System.out.println("Mac電腦登錄"); } }
調(diào)用:
public class Client { public static void main(String[] args) { AbstractComputer comp = new WindowsComputer(); comp.startUp(); comp = new MacComputer(); comp.startUp(); } }
結(jié)果:
--------開(kāi)機(jī) START-------- Windows電腦開(kāi)啟電源 Windows電腦檢查硬件 Windows電腦載入操作系統(tǒng) -------- 開(kāi)機(jī) END -------- --------開(kāi)機(jī) START-------- Mac電腦開(kāi)啟電源 Mac電腦檢查硬件 Mac電腦載入操作系統(tǒng) Mac電腦登錄 -------- 開(kāi)機(jī) END --------
六、Android源碼中的模板方法模式
1、AsyncTask
在使用AsyncTask時(shí),我們都知道把耗時(shí)操作放到doInBackground(Params… params)中,在doInBackground之前,如果想做一些初始化操作,可以把實(shí)現(xiàn)寫(xiě)在onPreExecute中,當(dāng)doInBackground執(zhí)行完后會(huì)執(zhí)行onPostExecute方法,而我們只需要構(gòu)建AsyncTask對(duì)象,然后執(zhí)行execute方法。
2、Activity的生命周期
ActivityThread的main函數(shù)被調(diào)用后,依次執(zhí)行Activity的onCreate、onStart、onResume函數(shù),用戶(hù)通常在Activity的子類(lèi)中覆寫(xiě)onCreate方法,并且在該方法中調(diào)用setContentView來(lái)設(shè)置布局。
七、區(qū)別
工廠方法是模板方法的一種特殊版本。
策略模式和模板方法模式都是封裝算法,一個(gè)用組合,一個(gè)用繼承。
策略模式和模板模式通常可以互相替換。它們都像試卷,策略模式是選擇題,模板模式是填空題。
八、總結(jié)
模板方法模式用4個(gè)字概括就是:流程封裝。也就是把某個(gè)固定的流程封裝到一個(gè)final方法中,并且讓子類(lèi)能夠定制這個(gè)流程中的某些或者所有步驟,這就要求父類(lèi)提取公用的代碼,提升代碼的復(fù)用率,同時(shí)帶來(lái)了更好的可擴(kuò)展性。
優(yōu)點(diǎn):
封裝不變部分,擴(kuò)展可變部分。
提取公共部分代碼,便于維護(hù)。
缺點(diǎn):
需要為每一個(gè)基本方法的不同實(shí)現(xiàn)提供一個(gè)子類(lèi),如果父類(lèi)中可變的基本方法太多,將會(huì)導(dǎo)致類(lèi)的個(gè)數(shù)增加,系統(tǒng)更加龐大,設(shè)計(jì)也更加抽象,此時(shí),可結(jié)合橋接模式來(lái)進(jìn)行設(shè)計(jì)。
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Android開(kāi)發(fā)入門(mén)與進(jìn)階教程》、《Android調(diào)試技巧與常見(jiàn)問(wèn)題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
相關(guān)文章
圖文詳解Android Studio搭建Android集成開(kāi)發(fā)環(huán)境的過(guò)程
這篇文章主要以圖文的方式詳細(xì)介紹了Android Studio搭建Android集成開(kāi)發(fā)環(huán)境的過(guò)程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-12-12Android實(shí)現(xiàn)簡(jiǎn)單加法計(jì)算器
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡(jiǎn)單加法計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03解決android viewmodel 數(shù)據(jù)刷新異常的問(wèn)題
這篇文章主要介紹了解決android viewmodel 數(shù)據(jù)刷新異常的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Android 2.3.7.r1 camera錄像過(guò)程中按menu菜單鍵時(shí)會(huì)停止錄像
android GB版本的camera錄像過(guò)程中按“菜單”鍵會(huì)停止錄像,改成錄像時(shí)按menu鍵不做處理,具體修改方法如下,感興趣的朋友可以參考下哈2013-06-06Android中用StaticLayout實(shí)現(xiàn)文本繪制自動(dòng)換行詳解
StaticLayout是android中處理文字換行的一個(gè)工具類(lèi),StaticLayout已經(jīng)實(shí)現(xiàn)了文本繪制換行處理,下面這篇文章主要介紹了Android中用StaticLayout實(shí)現(xiàn)文本繪制自動(dòng)換行的相關(guān)資料,需要的朋友可以參考。2017-03-03Android開(kāi)發(fā)使用Activity嵌套多個(gè)Fragment實(shí)現(xiàn)橫豎屏切換功能的方法
這篇文章主要介紹了Android開(kāi)發(fā)使用Activity嵌套多個(gè)Fragment實(shí)現(xiàn)橫豎屏切換功能的方法,結(jié)合實(shí)例形式分析了Android使用Activity嵌套多個(gè)Fragment進(jìn)行橫豎屏切換的原理與具體操作技巧,需要的朋友可以參考下2017-11-11Android Flutter實(shí)現(xiàn)原理淺析
這篇文章主要介紹了Android Flutter的實(shí)現(xiàn)原理是怎么樣的,flutter可以說(shuō)是當(dāng)下最流行的跨平臺(tái)技術(shù)了,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Android獲取監(jiān)聽(tīng)SD卡狀態(tài)
本篇文章主要介紹了Android獲取監(jiān)聽(tīng)SD卡狀態(tài),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03Android開(kāi)發(fā)實(shí)現(xiàn)的標(biāo)準(zhǔn)體重計(jì)算器功能示例
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)的標(biāo)準(zhǔn)體重計(jì)算器功能,結(jié)合實(shí)例形式分析了Android體重計(jì)算器的界面布局與功能實(shí)現(xiàn)相關(guān)操作技巧,需要的朋友可以參考下2017-12-12Android自定義UI手勢(shì)密碼改進(jìn)版源碼下載
這篇文章主要介紹了Android自定義UI手勢(shì)密碼改進(jìn)版,為大家提供了手勢(shì)密碼源碼下載,,具有一定的實(shí)用性,感興趣的小伙伴們可以參考一下2016-10-10