溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java模版方法模式的示例分析

發(fā)布時間:2021-08-11 14:26:32 來源:億速云 閱讀:144 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關(guān)java模版方法模式的示例分析的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

java模版方法模式

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

類型:行為類模式

類圖:

java模版方法模式的示例分析

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

寫完后,A找到剛畢業(yè)入職不久的同事B說:有個任務(wù),主要邏輯我已經(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 }; 
 // 預(yù)設(shè)數(shù)據(jù)數(shù)組 
 public static void main(String[] args){ 
 AbstractSort s = new ConcreteSort(); 
 s.showSortResult(a); 
 } 
}

運行結(jié)果:

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

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

模版方法模式的結(jié)構(gòu)

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

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

       容易擴(kuò)展。一般來說,抽象類中的模版方法是不易反生改變的部分,而抽象方法是容易反生變化的部分,因此通過增加實現(xiàn)類一般可以很容易實現(xiàn)功能的擴(kuò)展,符合開閉原則。
       便于維護(hù)。對于模版方法模式來說,正是由于他們的主要邏輯相同,才使用了模版方法,假如不使用模版方法,任由這些相同的代碼散亂的分布在不同的類中,維護(hù)起來是非常不方便的。
       比較靈活。因為有鉤子方法,因此,子類的實現(xiàn)也可以影響父類中主邏輯的運行。但是,在靈活的同時,由于子類影響到了父類,違反了里氏替換原則,也會給程序帶來風(fēng)險。這就對抽象類的設(shè)計有了更高的要求。
       在多個子類擁有相同的方法,并且這些方法邏輯相同時,可以考慮使用模版方法模式。在程序的主框架相同,細(xì)節(jié)不同的場合下,也比較適合使用這種模式。

感謝各位的閱讀!關(guān)于“java模版方法模式的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI