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

設計模式之模版方法模式_動力節(jié)點Java學院整理

 更新時間:2017年08月10日 10:22:32   作者:zhengzhb  
這篇文章主要介紹了設計模式之模版方法模式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

類型:行為類模式

類圖:

事實上,模版方法是編程中一個經(jīng)常用到的模式。先來看一個例子,某日,程序員A拿到一個任務:給定一個整數(shù)數(shù)組,把數(shù)組中的數(shù)由小到大排序,然后把排序之后的結果打印出來。經(jīng)過分析之后,這個任務大體上可分為兩部分,排序和打印,打印功能好實現(xià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("排序結果:"); 
    for (int i = 0; i < array.length; i++){ 
      System.out.printf("%3s", array[i]); 
    } 
  } 
} 

寫完后,A找到剛畢業(yè)入職不久的同事B說:有個任務,主要邏輯我已經(jīng)寫好了,你把剩下的邏輯實現(xiàn)一下吧。于是把AbstractSort類給B,讓B寫實現(xiàn)。B拿過來一看,太簡單了,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]; // 儲存最小值 
        indexMin = i;  
      } 
    } 
    Temp = array[index]; // 交換兩數(shù)值 
    array[index] = array[indexMin]; 
    array[indexMin] = Temp; 
  } 
} 

寫好后交給A,A拿來一運行:

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

運行結果:

排序結果:  0  1  3  4  5  7  9 10 12 32

運行正常。行了,任務完成。沒錯,這就是模版方法模式。大部分剛步入職場的畢業(yè)生應該都有類似B的經(jīng)歷。一個復雜的任務,由公司中的牛人們將主要的邏輯寫好,然后把那些看上去比較簡單的方法寫成抽象的,交給其他的同事去開發(fā)。這種分工方式在編程人員水平層次比較明顯的公司中經(jīng)常用到。比如一個項目組,有架構師,高級工程師,初級工程師,則一般由架構師使用大量的接口、抽象類將整個系統(tǒng)的邏輯串起來,實現(xiàn)的編碼則根據(jù)難度的不同分別交給高級工程師和初級工程師來完成。怎么樣,是不是用到過模版方法模式?

模版方法模式的結構

模版方法模式由一個抽象類和一個(或一組)實現(xiàn)類通過繼承結構組成,抽象類中的方法分為三種:

  • 抽象方法:父類中只聲明但不加以實現(xiàn),而是定義好規(guī)范,然后由它的子類去實現(xiàn)。
  • 模版方法:由抽象類聲明并加以實現(xiàn)。一般來說,模版方法調用抽象方法來完成主要的邏輯功能,并且,模版方法大多會定義為final類型,指明主要的邏輯功能在子類中不能被重寫。
  • 鉤子方法:由抽象類聲明并加以實現(xiàn)。但是子類可以去擴展,子類可以通過擴展鉤子方法來影響模版方法的邏輯。
  • 抽象類的任務是搭建邏輯的框架,通常由經(jīng)驗豐富的人員編寫,因為抽象類的好壞直接決定了程序是否穩(wěn)定性。

實現(xiàn)類用來實現(xiàn)細節(jié)。抽象類中的模版方法正是通過實現(xiàn)類擴展的方法來完成業(yè)務邏輯。只要實現(xiàn)類中的擴展方法通過了單元測試,在模版方法正確的前提下,整體功能一般不會出現(xiàn)大的錯誤。

模版方法的優(yōu)點及適用場景

容易擴展。一般來說,抽象類中的模版方法是不易反生改變的部分,而抽象方法是容易反生變化的部分,因此通過增加實現(xiàn)類一般可以很容易實現(xiàn)功能的擴展,符合開閉原則。

便于維護。對于模版方法模式來說,正是由于他們的主要邏輯相同,才使用了模版方法,假如不使用模版方法,任由這些相同的代碼散亂的分布在不同的類中,維護起來是非常不方便的。

比較靈活。因為有鉤子方法,因此,子類的實現(xiàn)也可以影響父類中主邏輯的運行。但是,在靈活的同時,由于子類影響到了父類,違反了里氏替換原則,也會給程序帶來風險。這就對抽象類的設計有了更高的要求。

在多個子類擁有相同的方法,并且這些方法邏輯相同時,可以考慮使用模版方法模式。在程序的主框架相同,細節(jié)不同的場合下,也比較適合使用這種模式。

相關文章

  • Java實現(xiàn)學生管理系統(tǒng)(IO版)

    Java實現(xiàn)學生管理系統(tǒng)(IO版)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)學生管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • java遞歸菜單樹轉換成pojo對象

    java遞歸菜單樹轉換成pojo對象

    這篇文章介紹了java遞歸菜單樹轉換成pojo對象的具體實現(xiàn),有需要的朋友可以參考一下
    2013-08-08
  • 淺析Java如何優(yōu)雅的避免那無處不在的空指針異常

    淺析Java如何優(yōu)雅的避免那無處不在的空指針異常

    在Java編程語言中,NullPointerException(簡稱NPE)是一種常見的運行時異常,本文主要來和大家講講如何優(yōu)雅的避免這些空指針異常,需要的可以參考下
    2024-03-03
  • Spring中獲取Bean對象的三種注入方式與兩種注入方法詳解

    Spring中獲取Bean對象的三種注入方式與兩種注入方法詳解

    平常的Java開發(fā)中程序員在某個類中需要依賴其它類的方法,下面這篇文章主要給大家介紹了關于Spring中獲取Bean對象的三種注入方式與兩種注入方法的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • java實現(xiàn)策略模式使用示例

    java實現(xiàn)策略模式使用示例

    在使用圖像處理軟件處理圖片后,需要選擇一種格式進行保存。然而各種格式在底層實現(xiàn)的算法并不相同,這剛好適合策略模式。編寫程序,演示如何使用策略模式與簡單工廠模式組合進行開發(fā)
    2014-02-02
  • springboot實現(xiàn)rabbitmq消息確認的示例代碼

    springboot實現(xiàn)rabbitmq消息確認的示例代碼

    RabbitMQ的消息確認有兩種, 一種是消息發(fā)送確認,第二種是消費接收確認,本文主要介紹了springboot實現(xiàn)rabbitmq消息確認的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Java ArrayList擴容問題實例詳解

    Java ArrayList擴容問題實例詳解

    這篇文章主要介紹了Java ArrayList擴容問題實例詳解,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Java如何基于command調用openssl生成私鑰證書

    Java如何基于command調用openssl生成私鑰證書

    這篇文章主要介紹了Java如何基于command調用openssl生成私鑰證書,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Java版水果管理系統(tǒng)源碼

    Java版水果管理系統(tǒng)源碼

    這篇文章主要為大家詳細介紹了Java版水果管理系統(tǒng)源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 從基礎學java--數(shù)組

    從基礎學java--數(shù)組

    數(shù)組是相同類型數(shù)據(jù)的有序集合數(shù)組描述的是相同類型的若干個數(shù)據(jù),按照一定的先后次序排列組合而成。其中,每一個數(shù)據(jù)稱作一個數(shù)組元素,每個數(shù)組元素可以通過一個下標來訪問它們數(shù)組的聲明創(chuàng)建
    2021-09-09

最新評論

措美县| 大宁县| 临夏市| 南川市| 常山县| 盐池县| 会同县| 祁门县| 黑龙江省| 阳春市| 邢台市| 柞水县| 津市市| 富顺县| 漯河市| 宜良县| 南开区| 吉安县| 永靖县| 金堂县| 郑州市| 汤阴县| 东港市| 赣榆县| 阳高县| 宜春市| 博湖县| 扎兰屯市| 高清| 天台县| 六枝特区| 永寿县| 天门市| 蛟河市| 博罗县| 顺昌县| 土默特左旗| 峨边| 班玛县| 金乡县| 元阳县|