一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - 深入解析Java的設(shè)計(jì)模式編程中的模板方法模式

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

2020-03-27 19:31Zhang_H JAVA教程

這篇文章主要介紹了深入解析Java的設(shè)計(jì)模式編程中的模板方法模式, 模版方法模式由一個(gè)抽象類和一個(gè)(或一組)實(shí)現(xiàn)類通過繼承結(jié)構(gòu)組成,需要的朋友可以參考下

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

聽起來好高端的樣子,我的理解:

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

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

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

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

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

通用類圖:

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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說:有個(gè)任務(wù),主要邏輯我已經(jīng)寫好了,你把剩下的邏輯實(shí)現(xiàn)一下吧。于是把AbstractSort類給B,讓B寫實(shí)現(xiàn)。B拿過來一看,太簡單了,10分鐘搞定,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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拿來一運(yùn)行:

?
1
2
3
4
5
6
7
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é)果:

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

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

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

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

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

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

模板方法模式的適用場景:

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

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

    3.    重構(gòu)代碼

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

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

總結(jié):

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品精品久久宅男的天堂 | 国产伦精一区二区三区视频 | 男女男精品视频免费观看 | 国产亚洲精品视频中文字幕 | 好紧好爽范冰冰系列 | 武侠艳妇屈辱的张开双腿 | 亚洲成av人影院 | 韩国美女主播在线 | 午夜精品网站 | 青草视频在线观看免费资源 | 欧美男女交配 | 欧美高清片 | 欧美x×x | 国产小视频在线免费观看 | 高h校花 | 大香人蕉免费视频75 | 91精品综合久久久久m3u8 | 国产成人精品综合在线观看 | 久草青青在线 | 色综合97天天综合网 | 国产成人精品本亚洲 | 国产精品日韩欧美一区二区 | 草草免费观看视频在线 | 亚洲卡一卡2卡三卡4麻豆 | 成人啪精品视频免费网站 | 91精品国产在线 | 高h全肉动漫在线观看免费 高h辣h双处全是肉军婚 | 欧美日韩视频在线第一区二区三区 | 美女操穴视频 | 亚洲男gay | 国产小视频网站 | 9l桃色| 大陆国语自产精品视频在 | 修修视频在线观看 | 亚洲欧美日韩精品久久亚洲区 | 国产精品视频人人做人人爱 | 91亚洲专区 | 国产乱人乱精一区二区视频密 | 久久永久免费视频 | 精品国产自在天天线2019 | chinesespanking调教|