国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android編程設計模式之模板方法模式詳解

2019-10-22 18:18:34
字體:
來源:轉載
供稿:網友

本文實例講述了Android編程設計模式之模板方法模式。分享給大家供大家參考,具體如下:

一、介紹

在面向對象開發過程中,通常會遇到這樣的一個問題,我們知道一個算法所需的關鍵步驟,并確定了這些步驟的執行順序,但是,某些步驟的具體實現是未知的,或者說某些步驟的實現是會隨著環境的變化而改變的,例如,執行程序的流程大致如下:

1.檢查代碼的正確性;
2.鏈接相關的類庫;
3.編譯相關代碼;
4.執行程序。

對于不同的程序設計語言,上述4個步驟都是不一樣的,但是,它們的執行流程是固定的,這類問題的解決方案就是我們本章要講的模板方法模式。

二、定義

定義一個操作中的算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

三、使用場景

多個子類有公有的方法,并且邏輯基本相同時。

重要、復雜的算法,可以把核心算法設計為模板方法,周邊的相關細節功能則由各個子類實現。

重構時,模板方法模式是一個經常使用的模式,把相同的代碼抽取到父類中,然后通過鉤子函數約束其行為。

四、模板方法模式的UML類圖

UML類圖:

Android,設計模式,模板方法模式

角色介紹:

AbstractClass:抽象類,定義了一套算法框架。

ConcreteClass1:具體實現類1。

ConcreteClass2:具體實現類2。

五、簡單示例

模板方法實際上是封裝一個固定流程,就像是一套執行模板一樣,第一步該做什么,第二步該做什么都已經在抽象類中定義好。而子類可以有不同的算法實現,在框架不被修改的情況下實現某些步驟的算法替換,下面以打開計算機這個動作來簡單演示一下模板方法。打開計算機的整個過程都是相對固定的,首先啟動計算機電源,計算機檢測自身狀態沒有問題時將進入操作系統,對用戶進行驗證之后即可登錄計算機,下面我們使用模板方法來模擬一下這個過程:

抽象的 Computer

/** * 抽象的 Computer */public abstract class AbstractComputer {  //下面是抽象方法,子類可以覆蓋,不允許外部直接調用這些方法,所以用protected  /**   * 開啟電源   */  protected abstract void powerOn();  /**   * 檢查硬件   */  protected abstract void checkHardware();  /**   * 載入操作系統   */  protected abstract void loadOS();  /**   * 登錄   */  protected abstract void login();  //下面是鉤子方法,聲明并實現  /**   * 是否需要登錄   *   * @return true為需要登錄   */  protected boolean isLogin(){    return true;  }  //下面是模板方法,定義為final,子類不能覆蓋此方法  /**   * 啟動計算機方法,步驟為開啟電源、系統檢查、加載系統、檢查是否登錄。   */  public final void startUp(){    System.out.println("--------開機 START--------");    powerOn();    checkHardware();    loadOS();    if(isLogin()){      login();    }    System.out.println("-------- 開機 END --------");  }}

Windows系統電腦(不需登錄):

/** * Windows系統電腦 */public class WindowsComputer extends AbstractComputer{  @Override  protected void powerOn() {    System.out.println("Windows電腦開啟電源");  }  @Override  protected void checkHardware() {    System.out.println("Windows電腦檢查硬件");  }  @Override  protected void loadOS() {    System.out.println("Windows電腦載入操作系統");  }  @Override  protected void login() {  }  @Override  protected boolean isLogin() {    return false;//返回false,不需登錄  }}

Mac系統電腦(需登錄):

/** * Mac系統電腦 */public class MacComputer extends AbstractComputer{  @Override  protected void powerOn() {    System.out.println("Mac電腦開啟電源");  }  @Override  protected void checkHardware() {    System.out.println("Mac電腦檢查硬件");  }  @Override  protected void loadOS() {    System.out.println("Mac電腦載入操作系統");  }  @Override  protected void login() {    System.out.println("Mac電腦登錄");  }}

調用:

public class Client {  public static void main(String[] args) {    AbstractComputer comp = new WindowsComputer();    comp.startUp();    comp = new MacComputer();    comp.startUp();  }}

結果:

--------開機 START--------Windows電腦開啟電源Windows電腦檢查硬件Windows電腦載入操作系統-------- 開機 END ----------------開機 START--------Mac電腦開啟電源Mac電腦檢查硬件Mac電腦載入操作系統Mac電腦登錄-------- 開機 END --------

六、Android源碼中的模板方法模式

1、AsyncTask

在使用AsyncTask時,我們都知道把耗時操作放到doInBackground(Params… params)中,在doInBackground之前,如果想做一些初始化操作,可以把實現寫在onPreExecute中,當doInBackground執行完后會執行onPostExecute方法,而我們只需要構建AsyncTask對象,然后執行execute方法。

2、Activity的生命周期

ActivityThread的main函數被調用后,依次執行Activity的onCreate、onStart、onResume函數,用戶通常在Activity的子類中覆寫onCreate方法,并且在該方法中調用setContentView來設置布局。

七、區別

工廠方法是模板方法的一種特殊版本。

策略模式和模板方法模式都是封裝算法,一個用組合,一個用繼承。

策略模式和模板模式通常可以互相替換。它們都像試卷,策略模式是選擇題,模板模式是填空題。

八、總結

模板方法模式用4個字概括就是:流程封裝。也就是把某個固定的流程封裝到一個final方法中,并且讓子類能夠定制這個流程中的某些或者所有步驟,這就要求父類提取公用的代碼,提升代碼的復用率,同時帶來了更好的可擴展性。

優點:

封裝不變部分,擴展可變部分。

提取公共部分代碼,便于維護。

缺點:

需要為每一個基本方法的不同實現提供一個子類,如果父類中可變的基本方法太多,將會導致類的個數增加,系統更加龐大,設計也更加抽象,此時,可結合橋接模式來進行設計。

希望本文所述對大家Android程序設計有所幫助。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 荆州市| 六盘水市| 河曲县| 昆山市| 崇礼县| 房产| 桂平市| 平远县| 吴桥县| 娄底市| 高州市| 富宁县| 银川市| 曲沃县| 淮安市| 河曲县| 太保市| 和政县| 永川市| 常州市| 巴林右旗| 榆树市| 高州市| 澄江县| 廉江市| 香格里拉县| 佛教| 应城市| 鹤庆县| 玛曲县| 清涧县| 昌黎县| 刚察县| 华蓥市| 崇阳县| 卓尼县| 张掖市| 宁安市| 巴南区| 南漳县| 峡江县|