最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android編程設(shè)計(jì)模式之模板方法模式詳解

 更新時(shí)間:2017年12月26日 11:00:01   作者:蹲街式等待  
這篇文章主要介紹了Android編程設(shè)計(jì)模式之模板方法模式,結(jié)合實(shí)例形式詳細(xì)分析了Android模板方法模式的概念、功能、使用場(chǎng)景、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下

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

一、介紹

在面向?qū)ο箝_發(fā)過程中,通常會(huì)遇到這樣的一個(gè)問題,我們知道一個(gè)算法所需的關(guān)鍵步驟,并確定了這些步驟的執(zhí)行順序,但是,某些步驟的具體實(shí)現(xiàn)是未知的,或者說某些步驟的實(shí)現(xiàn)是會(huì)隨著環(huán)境的變化而改變的,例如,執(zhí)行程序的流程大致如下:

1.檢查代碼的正確性;
2.鏈接相關(guān)的類庫;
3.編譯相關(guān)代碼;
4.執(zhí)行程序。

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

二、定義

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

三、使用場(chǎng)景

多個(gè)子類有公有的方法,并且邏輯基本相同時(shí)。

重要、復(fù)雜的算法,可以把核心算法設(shè)計(jì)為模板方法,周邊的相關(guān)細(xì)節(jié)功能則由各個(gè)子類實(shí)現(xiàn)。

重構(gòu)時(shí),模板方法模式是一個(gè)經(jīng)常使用的模式,把相同的代碼抽取到父類中,然后通過鉤子函數(shù)約束其行為。

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

UML類圖:

角色介紹:

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

ConcreteClass1:具體實(shí)現(xiàn)類1。

ConcreteClass2:具體實(shí)現(xiàn)類2。

五、簡(jiǎn)單示例

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

抽象的 Computer

/**
 * 抽象的 Computer
 */
public abstract class AbstractComputer {
  //下面是抽象方法,子類可以覆蓋,不允許外部直接調(diào)用這些方法,所以用protected
  /**
   * 開啟電源
   */
  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,子類不能覆蓋此方法
  /**
   * 啟動(dòng)計(jì)算機(jī)方法,步驟為開啟電源、系統(tǒng)檢查、加載系統(tǒng)、檢查是否登錄。
   */
  public final void startUp(){
    System.out.println("--------開機(jī) START--------");
    powerOn();
    checkHardware();
    loadOS();
    if(isLogin()){
      login();
    }
    System.out.println("-------- 開機(jī) END --------");
  }
}

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

/**
 * Windows系統(tǒng)電腦
 */
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電腦載入操作系統(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電腦開啟電源");
  }
  @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é)果:

--------開機(jī) START--------
Windows電腦開啟電源
Windows電腦檢查硬件
Windows電腦載入操作系統(tǒng)
-------- 開機(jī) END --------
--------開機(jī) START--------
Mac電腦開啟電源
Mac電腦檢查硬件
Mac電腦載入操作系統(tǒng)
Mac電腦登錄
-------- 開機(jī) END --------

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

1、AsyncTask

在使用AsyncTask時(shí),我們都知道把耗時(shí)操作放到doInBackground(Params… params)中,在doInBackground之前,如果想做一些初始化操作,可以把實(shí)現(xiàn)寫在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ù),用戶通常在Activity的子類中覆寫onCreate方法,并且在該方法中調(diào)用setContentView來設(shè)置布局。

七、區(qū)別

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

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

策略模式和模板模式通??梢曰ハ嗵鎿Q。它們都像試卷,策略模式是選擇題,模板模式是填空題。

八、總結(jié)

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

優(yōu)點(diǎn):

封裝不變部分,擴(kuò)展可變部分。

提取公共部分代碼,便于維護(hù)。

缺點(diǎn):

需要為每一個(gè)基本方法的不同實(shí)現(xiàn)提供一個(gè)子類,如果父類中可變的基本方法太多,將會(huì)導(dǎo)致類的個(gè)數(shù)增加,系統(tǒng)更加龐大,設(shè)計(jì)也更加抽象,此時(shí),可結(jié)合橋接模式來進(jìn)行設(shè)計(jì)。

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進(jìn)階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)

希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Android實(shí)現(xiàn)粒子爆炸效果的方法

    Android實(shí)現(xiàn)粒子爆炸效果的方法

    這篇文章主要介紹了Android實(shí)現(xiàn)粒子爆炸效果的方法,實(shí)例分析了Android動(dòng)畫特效的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-06-06
  • android實(shí)現(xiàn)歡迎界面效果

    android實(shí)現(xiàn)歡迎界面效果

    這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)歡迎界面效果,涉及到頁面的滑動(dòng)實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Android RecycleView使用(CheckBox全選、反選、單選)

    Android RecycleView使用(CheckBox全選、反選、單選)

    這篇文章主要為大家詳細(xì)介紹了Android RecycleView使用,CheckBox全選、反選、單選效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Android 日期選擇器實(shí)例代碼

    Android 日期選擇器實(shí)例代碼

    這篇文章主要介紹了Android 日期選擇器實(shí)例代碼,需要的朋友可以參考下
    2017-05-05
  • Android中傳遞圖片的2種方法

    Android中傳遞圖片的2種方法

    這篇文章主要介紹了Android中傳遞圖片的2種方法,本文分別給出種方法的操作代碼實(shí)例,需要的朋友可以參考下
    2015-04-04
  • Flutter軟鍵盤的原理淺析

    Flutter軟鍵盤的原理淺析

    大家應(yīng)該都知道目前Flutter官方是沒有自定義鍵盤的解決方案,下面這篇文章主要給大家介紹了關(guān)于Flutter軟鍵盤原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • 詳解Retrofit 動(dòng)態(tài)參數(shù)(非固定參數(shù)、非必須參數(shù))(Get、Post請(qǐng)求)

    詳解Retrofit 動(dòng)態(tài)參數(shù)(非固定參數(shù)、非必須參數(shù))(Get、Post請(qǐng)求)

    這篇文章主要介紹了詳解Retrofit 動(dòng)態(tài)參數(shù)(非固定參數(shù)、非必須參數(shù))(Get、Post請(qǐng)求),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • Android ListView異步加載圖片方法詳解

    Android ListView異步加載圖片方法詳解

    這篇文章主要介紹了Android ListView異步加載圖片方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了ListView異步加載圖片的原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-02-02
  • Android開發(fā)筆記之Android中數(shù)據(jù)的存儲(chǔ)方式(二)

    Android開發(fā)筆記之Android中數(shù)據(jù)的存儲(chǔ)方式(二)

    我們?cè)趯?shí)際開發(fā)中,有的時(shí)候需要儲(chǔ)存或者備份比較復(fù)雜的數(shù)據(jù)。這些數(shù)據(jù)的特點(diǎn)是,內(nèi)容多、結(jié)構(gòu)大,比如短信備份等,通過本文給大家介紹Android開發(fā)筆記之Android中數(shù)據(jù)的存儲(chǔ)方式(二),對(duì)android數(shù)據(jù)存儲(chǔ)方式相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • Android 對(duì)手機(jī)網(wǎng)絡(luò)的檢測(cè)和監(jiān)聽的方法示例

    Android 對(duì)手機(jī)網(wǎng)絡(luò)的檢測(cè)和監(jiān)聽的方法示例

    本篇文章主要介紹了Android 對(duì)手機(jī)網(wǎng)絡(luò)的檢測(cè)和監(jiān)聽的方法示例,主要使用BroadcastReceiver廣播接收器來接收網(wǎng)絡(luò)狀態(tài),現(xiàn)在分享給大家,也給大家做個(gè)參考,有興趣的一起來了解一下
    2018-03-03

最新評(píng)論

阿巴嘎旗| 新巴尔虎右旗| 泽库县| 巍山| 南江县| 南靖县| 社会| 蓬溪县| 名山县| 钦州市| 锦屏县| 昆山市| 门源| 双柏县| 景谷| 余庆县| 卓资县| 锦屏县| 昌黎县| 新闻| 凤城市| 化德县| 黎川县| 屏南县| 呼图壁县| 阿拉尔市| 集安市| 万安县| 斗六市| 贵定县| 应城市| 中山市| 伊宁市| 武义县| 利辛县| 隆化县| 郸城县| 宜兰市| 长宁县| 扶余县| 屏山县|