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

深入解析Java的設(shè)計(jì)模式編程中的模板方法模式

 更新時(shí)間:2016年02月03日 17:41:47   作者:Zhang_H  
這篇文章主要介紹了深入解析Java的設(shè)計(jì)模式編程中的模板方法模式, 模版方法模式由一個(gè)抽象類和一個(gè)(或一組)實(shí)現(xiàn)類通過(guò)繼承結(jié)構(gòu)組成,需要的朋友可以參考下

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

聽起來(lái)好高端的樣子,我的理解:

    1.父類聲明了若干個(gè)抽象方法(基本方法)和若干個(gè)具體方法(模板方法)

    2.抽象方法是一個(gè)算法(過(guò)程)的步驟,在子類中實(shí)現(xiàn)

    3.模板方法是一個(gè)算法(過(guò)程)的框架,在父類中已經(jīng)約定好,實(shí)現(xiàn)對(duì)基本方法調(diào)用,完成固定的邏輯

    4.一個(gè)算法(過(guò)程)的結(jié)構(gòu)在父類中定義,具體的實(shí)現(xiàn)細(xì)節(jié)則在子類中實(shí)現(xiàn)

    注:為了防止惡意操作,一般模板方法都加上final,禁止重寫

通用類圖:

201623173930405.jpg (381×239)

事實(shí)上,模版方法是編程中一個(gè)經(jīng)常用到的模式。先來(lái)看一個(gè)例子,某日,程序員A拿到一個(gè)任務(wù):給定一個(gè)整數(shù)數(shù)組,把數(shù)組中的數(shù)由小到大排序,然后把排序之后的結(jié)果打印出來(lái)。經(jīng)過(guò)分析之后,這個(gè)任務(wù)大體上可分為兩部分,排序和打印,打印功能好實(shí)現(xiàn),排序就有點(diǎn)麻煩了。但是A有辦法,先把打印功能完成,排序功能另找人做。

abstract class AbstractSort { 
   
  /** 
   * 將數(shù)組array由小到大排序 
   * @param array 
   */ 
  protected abstract void sort(int[] array); 
   
  public void showSortResult(int[] array){ 
    this.sort(array); 
    System.out.print("排序結(jié)果:"); 
    for (int i = 0; i < array.length; i++){ 
      System.out.printf("%3s", array[i]); 
    } 
  } 
} 

        寫完后,A找到剛畢業(yè)入職不久的同事B說(shuō):有個(gè)任務(wù),主要邏輯我已經(jīng)寫好了,你把剩下的邏輯實(shí)現(xiàn)一下吧。于是把AbstractSort類給B,讓B寫實(shí)現(xiàn)。B拿過(guò)來(lái)一看,太簡(jiǎn)單了,10分鐘搞定,代碼如下:

class ConcreteSort extends AbstractSort { 
 
  @Override 
  protected void sort(int[] array){ 
    for(int i=0; i<array.length-1; i++){ 
      selectSort(array, i); 
    } 
  } 
   
  private void selectSort(int[] array, int index) { 
    int MinValue = 32767; // 最小值變量 
    int indexMin = 0; // 最小值索引變量 
    int Temp; // 暫存變量 
    for (int i = index; i < array.length; i++) { 
      if (array[i] < MinValue){ // 找到最小值 
        MinValue = array[i]; // 儲(chǔ)存最小值 
        indexMin = i;  
      } 
    } 
    Temp = array[index]; // 交換兩數(shù)值 
    array[index] = array[indexMin]; 
    array[indexMin] = Temp; 
  } 
} 

寫好后交給A,A拿來(lái)一運(yùn)行:

public class Client { 
  public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 }; // 預(yù)設(shè)數(shù)據(jù)數(shù)組 
  public static void main(String[] args){ 
    AbstractSort s = new ConcreteSort(); 
    s.showSortResult(a); 
  } 
} 

運(yùn)行結(jié)果:

排序結(jié)果: 0 1 3 4 5 7 9 10 12 32

  
 
模版方法模式的結(jié)構(gòu)
       模版方法模式由一個(gè)抽象類和一個(gè)(或一組)實(shí)現(xiàn)類通過(guò)繼承結(jié)構(gòu)組成,抽象類中的方法分為三種:
抽象方法:父類中只聲明但不加以實(shí)現(xiàn),而是定義好規(guī)范,然后由它的子類去實(shí)現(xiàn)。
模版方法:由抽象類聲明并加以實(shí)現(xiàn)。一般來(lái)說(shuō),模版方法調(diào)用抽象方法來(lái)完成主要的邏輯功能,并且,模版方法大多會(huì)定義為final類型,指明主要的邏輯功能在子類中不能被重寫。
鉤子方法:由抽象類聲明并加以實(shí)現(xiàn)。但是子類可以去擴(kuò)展,子類可以通過(guò)擴(kuò)展鉤子方法來(lái)影響模版方法的邏輯。
抽象類的任務(wù)是搭建邏輯的框架,通常由經(jīng)驗(yàn)豐富的人員編寫,因?yàn)槌橄箢惖暮脡闹苯記Q定了程序是否穩(wěn)定性。
       實(shí)現(xiàn)類用來(lái)實(shí)現(xiàn)細(xì)節(jié)。抽象類中的模版方法正是通過(guò)實(shí)現(xiàn)類擴(kuò)展的方法來(lái)完成業(yè)務(wù)邏輯。只要實(shí)現(xiàn)類中的擴(kuò)展方法通過(guò)了單元測(cè)試,在模版方法正確的前提下,整體功能一般不會(huì)出現(xiàn)大的錯(cuò)誤。
 

 
模板方法模式的優(yōu)點(diǎn):

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

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

    3.  行為由父類控制,子類實(shí)現(xiàn)

模板方法模式的適用場(chǎng)景:

    1.     多個(gè)子類有公共方法,并且邏輯基本相同

    2.    對(duì)復(fù)雜的算法,核心算法設(shè)計(jì)為模板方法,細(xì)節(jié)功能則由各個(gè)子類實(shí)現(xiàn)

    3.    重構(gòu)代碼

模板方法模式的擴(kuò)展

  •     基本方法由于不需要對(duì)外提供訪問(wèn),因此可以設(shè)計(jì)為protected類型
  •     設(shè)計(jì)鉤子方法(Hook Method):對(duì)外部提供接口,可以影響模板方法內(nèi)的具體執(zhí)行順序

總結(jié):

    父類建立框架,子類在重寫了父類部分方法后,再調(diào)用從父類繼承的方法,產(chǎn)生不同的結(jié)果。

相關(guān)文章

  • Java中equals方法使用及重寫練習(xí)

    Java中equals方法使用及重寫練習(xí)

    equals是在object類中的方法,在object中equals是用來(lái)看看兩個(gè)參數(shù)是否引用的是同一個(gè)對(duì)象,下面這篇文章主要給大家介紹了關(guān)于Java中equals方法使用及重寫練習(xí)的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • Mybatis-Plus3.x的創(chuàng)建步驟及使用教程

    Mybatis-Plus3.x的創(chuàng)建步驟及使用教程

    MyBatis-Plus是一個(gè)?MyBatis?的增強(qiáng)工具,在?MyBatis?的基礎(chǔ)上只做增強(qiáng)不做改變,為?簡(jiǎn)化開發(fā)、提高效率而生,這篇文章主要介紹了Mybatis-Plus3.x的使用,需要的朋友可以參考下
    2023-10-10
  • java求100之內(nèi)的素?cái)?shù)(質(zhì)數(shù))簡(jiǎn)單示例

    java求100之內(nèi)的素?cái)?shù)(質(zhì)數(shù))簡(jiǎn)單示例

    這篇文章主要介紹了java求100之內(nèi)的素?cái)?shù)簡(jiǎn)單示例,素?cái)?shù)是一個(gè)大于1的自然數(shù),如果除了1和它自身外,不能被其他自然數(shù)整除的數(shù);否則稱為合數(shù)
    2014-04-04
  • 對(duì)Java中JSON解析器的一些見解

    對(duì)Java中JSON解析器的一些見解

    這篇文章主要是對(duì)Java中JSON解析器的一些見解。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-12-12
  • idea離線使用jrebel的超詳細(xì)教程

    idea離線使用jrebel的超詳細(xì)教程

    IDEA上原生是不支持熱部署的,一般更新了 Java 文件后要手動(dòng)重啟 Tomcat 服務(wù)器,才能生效,下面通過(guò)本文給大家分享idea離線使用jrebel的超詳細(xì)教程(親測(cè)有效),感興趣的朋友一起看看吧
    2020-12-12
  • Hibernate用ThreadLocal模式(線程局部變量模式)管理Session

    Hibernate用ThreadLocal模式(線程局部變量模式)管理Session

    今天小編就為大家分享一篇關(guān)于Hibernate用ThreadLocal模式(線程局部變量模式)管理Session,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • 詳解Java攔截器以及自定義注解的使用

    詳解Java攔截器以及自定義注解的使用

    這篇文章主要為大家介紹了Java攔截器以及自定義注解的使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助<BR>
    2021-12-12
  • 深入解析Java的Hibernate框架中的持久對(duì)象

    深入解析Java的Hibernate框架中的持久對(duì)象

    Hibernate的持久對(duì)象在數(shù)據(jù)庫(kù)數(shù)據(jù)操作中有著重要作用,這里我們就來(lái)深入解析Java的Hibernate框架中的持久對(duì)象,首先必須從理解持久化對(duì)象的生命周期開始:
    2016-07-07
  • Java中Stream流的peek方法詳解及常見使用場(chǎng)景

    Java中Stream流的peek方法詳解及常見使用場(chǎng)景

    這篇文章主要介紹了Java中Stream流的peek方法詳解及常見使用場(chǎng)景的相關(guān)資料,peek()方法是一個(gè)中間操作,用于在流的每個(gè)元素上執(zhí)行一個(gè)操作,而不會(huì)改變流中的元素或中斷流的處理,需要的朋友可以參考下
    2025-03-03
  • 詳解java8在Collection中新增加的方法removeIf

    詳解java8在Collection中新增加的方法removeIf

    這篇文章主要介紹了詳解java8在Collection中新增加的方法removeIf的相關(guān)資料,需要的朋友可以參考下
    2018-01-01

最新評(píng)論

梧州市| 泰州市| 邵阳县| 耒阳市| 文水县| 米林县| 昌图县| 莆田市| 盐源县| 集贤县| 耒阳市| 阳春市| 九寨沟县| 锡林浩特市| 新余市| 凌云县| 博罗县| 永川市| 航空| 临泉县| 浦东新区| 孟津县| 舞阳县| 慈溪市| 南康市| 东光县| 恭城| 肥西县| 林州市| 海伦市| 冀州市| 丹凤县| 峨边| 赫章县| 剑阁县| 樟树市| 竹北市| 普安县| 黄浦区| 琼结县| 克东县|