<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                #模版方法模式(Template method pattern) ##簡介 模板方法模式定義了一個算法的步驟,并允許子類別為一個或多個步驟提供其實踐方式。讓子類別在不改變算法架構的情況下,重新定義算法中的某些步驟。在軟件工程中,它是一種軟件設計模式,和C++模板沒有關連。 ##實例 事實上,模版方法是編程中一個經常用到的模式。先來看一個例子,某日,程序員A拿到一個任務:給定一個整數數組,把數組中的數由小到大排序,然后把排序之后的結果打印出來。經過分析之后,這個任務大體上可分為兩部分,排序和打印,打印功能好實現,排序就有點麻煩了。但是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]); } } } ``` 寫完后,A找到剛畢業入職不久的同事B說:有個任務,主要邏輯我已經寫好了,你把剩下的邏輯實現一下吧。于是把AbstractSort類給B,讓B寫實現。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]; // 交換兩數值 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 }; // 預設數據數組 public static void main(String[] args){ AbstractSort s = new ConcreteSort(); s.showSortResult(a); } } ``` 排序結果: 0 1 3 4 5 7 9 10 12 32 運行正常。行了,任務完成。沒錯,這就是模版方法模式。大部分剛步入職場的畢業生應該都有類似B的經歷。一個復雜的任務,由公司中的牛人們將主要的邏輯寫好,然后把那些看上去比較簡單的方法寫成抽象的,交給其他的同事去開發。這種分工方式在編程人員水平層次比較明顯的公司中經常用到。比如一個項目組,有架構師,高級工程師,初級工程師,則一般由架構師使用大量的接口、抽象類將整個系統的邏輯串起來,實現的編碼則根據難度的不同分別交給高級工程師和初級工程師來完成。怎么樣,是不是用到過模版方法模式? ###模版方法的優點及適用場景 `AbstractClass`是一個抽象類,其實也就是一個抽象模版,定義并實現一個模版的方法。這個模版的方法一般是一個具體的方法,它給出了一個頂級邏輯的骨架,而邏輯組成步驟在相應的抽象操作中,推遲到子類實現。頂級邏輯也有可能調用一些具體方法。 ``` abstract class AbstractClass { public abstract void PrimitiveOperation1(); public abstract void PrimitiveOperation2(); public void TemplateMethod() { PrimitiveOperation1(); PrimitiveOperation2(); console.WriteLine(""); } } ``` `ConcreteClass`實現夫類所定義的一個或者多個抽象方法。每一個`AbstractClass`都可以有任意多個`ConcreteClass`與之對應,而每一個`ConcreteClass`都可以給出這些抽象方法(也就是頂級邏輯的組成步驟)的不同實現,從而使得頂級邏輯的實現各不相同。 ``` class ConcreteClassA: AbstractClass { public override void PrimitiveOperation1() { Console.writeLine("具體類A方法1實現"); } public override void PrimitiveOperation2() { Console.writeLine("具體類A方法2實現"); } } class ConcreteClassB: AbstractClass { public override void PrimitiveOperation1() { Console.writeLine("具體類B方法1實現"); } public override void PrimitiveOperation2() { Console.writeLine("具體類B方法2實現"); } } ``` 客戶端調用 ``` static void Main(string[] args) { AbstractClass c; c = new ConcreteClassA(); c.TemplateMethod(); c = new ConcreteClassB(); c.TemplateMethod(); Console.Read(); } ``` ***模版方法模式是通過把不變的行為搬移到超類,去除子類中的重復代碼來體現它的優勢。當不變的和可變的行為在方法的子類實現中混合在一起的時候,不變的行為就會在子類中重復出現。我們通過模版方法模式把這些行為版已到單一的地方,這樣就幫助子類擺脫重復的不變的行為的糾纏。***
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看