<wbr id="jl7f7"></wbr>

        <i id="jl7f7"></i>
          <acronym id="jl7f7"></acronym>

          <s id="jl7f7"></s>

          <ins id="jl7f7"></ins><button id="jl7f7"><strong id="jl7f7"></strong></button>
          鍍金池/ 教程/ Java/ 模版方法模式
          訪(fǎng)問(wèn)者模式
          訪(fǎng)問(wèn)者模式討論篇:java的動(dòng)態(tài)綁定與雙分派
          責任連模式
          迭代器模式
          策略模式
          命令模式
          單例模式
          建造者模式
          解釋器模式
          工廠(chǎng)方法模式
          備忘錄模式
          原型模式
          單例模式討論篇:?jiǎn)卫J脚c垃圾回收
          觀(guān)察者模式
          模版方法模式
          創(chuàng )建類(lèi)模式總結篇
          抽象工廠(chǎng)模式
          中介者模式

          模版方法模式

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

          類(lèi)型:行為類(lèi)模式

          類(lèi)圖:

          http://wiki.jikexueyuan.com/project/java-design-pattern/images/template-method-pattern-1.jpg" alt="template-method-pattern" />

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

              abstract class AbstractSort {
          
                  /**
                   * 將數組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]);
                      }
                  }
              }

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

          class ConcreteSort extends AbstractSort {
              @Override
              protected void sort(int[] array){
                  for(int i=0; i&lt;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 &lt; array.length; i++) {
                      if (array[i] &lt; MinValue){ // 找到最小值
                          MinValue = array[i]; // 儲存最小值
                          indexMin = i; 
                      }
                  }
                  Temp = array[index]; // 交換兩數值
                  array[index] = array[indexMin];
                  array[indexMin] = Temp;
              }
          }

          寫(xiě)好后交給A,A拿來(lái)一運行:

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

          運行結果:

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

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

          模版方法模式的結構

          模版方法模式由一個(gè)抽象類(lèi)和一個(gè)(或一組)實(shí)現類(lèi)通過(guò)繼承結構組成,抽象類(lèi)中的方法分為三種:

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

            實(shí)現類(lèi)用來(lái)實(shí)現細節。抽象類(lèi)中的模版方法正是通過(guò)實(shí)現類(lèi)擴展的方法來(lái)完成業(yè)務(wù)邏輯。只要實(shí)現類(lèi)中的擴展方法通過(guò)了單元測試,在模版方法正確的前提下,整體功能一般不會(huì )出現大的錯誤。

          模版方法的優(yōu)點(diǎn)及適用場(chǎng)景

          容易擴展。一般來(lái)說(shuō),抽象類(lèi)中的模版方法是不易反生改變的部分,而抽象方法是容易反生變化的部分,因此通過(guò)增加實(shí)現類(lèi)一般可以很容易實(shí)現功能的擴展,符合開(kāi)閉原則。

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

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

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

          上一篇:原型模式下一篇:迭代器模式
          日韩性做爰免费a片aa片,天天躁恨恨躁夜躁2020,精品久久综合1区2区3区激情,精产国品一二三产品麻豆

          <wbr id="jl7f7"></wbr>

                <i id="jl7f7"></i>
                  <acronym id="jl7f7"></acronym>

                  <s id="jl7f7"></s>

                  <ins id="jl7f7"></ins><button id="jl7f7"><strong id="jl7f7"></strong></button>