1. 程式人生 > >java 模版方法模式

java 模版方法模式

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

型別:行為類模式

類圖:

        事實上,模版方法是程式設計中一個經常用到的模式。先來看一個例子,某日,程式設計師A拿到一個任務:給定一個整數陣列,把陣列中的數由小到大排序,然後把排序之後的結果打印出來。經過分析之後,這個任務大體上可分為兩部分,排序和列印,列印功能好實現,排序就有點麻煩了。但是A有辦法,先把列印功能完成,排序功能另找人做。

  1. abstractclass AbstractSort {  
  2.     /** 
  3.      * 將陣列array由小到大排序
     
  4.      * @param array 
  5.      */
  6.     protectedabstractvoid sort(int[] array);  
  7.     publicvoid showSortResult(int[] array){  
  8.         this.sort(array);  
  9.         System.out.print("排序結果:");  
  10.         for (int i = 0; i < array.length; i++){  
  11.             System.out.printf("%3s", array[i]);  
  12.         }  
  13.     }  
  14. }  

        寫完後,A找到剛畢業入職不久的同事B說:有個任務,主要邏輯我已經寫好了,你把剩下的邏輯實現一下吧。於是把AbstractSort類給B,讓B寫實現。B拿過來一看,太簡單了,10分鐘搞定,程式碼如下:

  1. class ConcreteSort extends AbstractSort {  
  2.     @Override
  3.     protectedvoid sort(int[] array){  
  4.         for(int i=0; i<array.length-1; i++){  
  5.             selectSort(array, i);  
  6.         }  
  7.     }  
  8.     privatevoid selectSort(int[] array, int index) {  
  9.         int MinValue = 32767// 最小值變數
  10.         int indexMin = 0// 最小值索引變數
  11.         int Temp; // 暫存變數
  12.         for (int i = index; i < array.length; i++) {  
  13.             if (array[i] < MinValue){ // 找到最小值
  14.                 MinValue = array[i]; // 儲存最小值
  15.                 indexMin = i;   
  16.             }  
  17.         }  
  18.         Temp = array[index]; // 交換兩數值
  19.         array[index] = array[indexMin];  
  20.         array[indexMin] = Temp;  
  21.     }  
  22. }  

寫好後交給A,A拿來一執行:

  1. publicclass Client {  
  2.     publicstaticint[] a = { 1032195712043 }; // 預設資料陣列
  3.     publicstaticvoid main(String[] args){  
  4.         AbstractSort s = new ConcreteSort();  
  5.         s.showSortResult(a);  
  6.     }  
  7. }  

執行結果:

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

        執行正常。行了,任務完成。沒錯,這就是模版方法模式。大部分剛步入職場的畢業生應該都有類似B的經歷。一個複雜的任務,由公司中的牛人們將主要的邏輯寫好,然後把那些看上去比較簡單的方法寫成抽象的,交給其他的同事去開發。這種分工方式在程式設計人員水平層次比較明顯的公司中經常用到。比如一個專案組,有架構師,高階工程師,初級工程師,則一般由架構師使用大量的介面、抽象類將整個系統的邏輯串起來,實現的編碼則根據難度的不同分別交給高階工程師和初級工程師來完成。怎麼樣,是不是用到過模版方法模式?

模版方法模式的結構

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

  • 抽象方法:父類中只宣告但不加以實現,而是定義好規範,然後由它的子類去實現。
  • 模版方法:由抽象類宣告並加以實現。一般來說,模版方法呼叫抽象方法來完成主要的邏輯功能,並且,模版方法大多會定義為final型別,指明主要的邏輯功能在子類中不能被重寫。
  • 鉤子方法:由抽象類宣告並加以實現。但是子類可以去擴充套件,子類可以通過擴充套件鉤子方法來影響模版方法的邏輯。
  • 抽象類的任務是搭建邏輯的框架,通常由經驗豐富的人員編寫,因為抽象類的好壞直接決定了程式是否穩定性。

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

模版方法的優點及適用場景

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

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

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

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

相關推薦

java 模版方法模式

定義:定義一個操作中演算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變演算法的結構即可重定義該演算法中的某些特定步驟。 型別:行為類模式 類圖:         事實上,模版方法是程式設計中一個經常用到的模式。先來看一個例子,某日,程式設計師A拿到一個任務:給

Java設計模式模版方法模式

設計模式 pla 控制 test style 步驟 str 模版 女人 概述 模板方法模式是類的行為模式。準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,然後聲明一些抽象方法來迫使子類實現剩余的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩余的

Java設計模式(三)模版方法模式

模版方法:在抽象類中定義了一個模版方法,在模版方法中使用了一些該抽象類中定義的空方法,而這些空方法可以供子類實現。 我們在檢視原始碼時經常能夠看到在執行一些重要的方法時,往往呼叫了一些看似沒有什麼意義的空方法。其實這就是模版方法。 abstract class Th

Java工廠方法模式

ace 工廠 @class int ret 類工廠 2014年 implement package 工廠方法模式: /** * 工廠方法模式:也叫工廠模式,屬於創建型模式,父類工廠(接口)負責定義產品對象的公共接口, * 而子類工廠負責創建具體的產品對象。 * 目的:

Java模版方法的另一種實現

pan strategy 全部 相關 必須 rod () 抽象方法 rate   面試荔枝FM杯具,遂死磕AQS途中發現一個有趣的模版用法,記下來。   模版方法是很重要的設計模式,在數據訪問層、眾多的插件接口都可見其影子,一般的實現都是在模版中定義抽象方法並使用其方法進行

由AbstractQueuedSynchronizer和ReentrantLock來看模版方法模式

however 結構圖 debug exception alt strac red con overhead   在學完volatile和CAS之後,近幾天在擼AbstractQueuedSynchronizer(AQS)的源代碼,很多並發工具都是基於AQS來實現的,這也是

23種設計模式(6):模版方法模式

框架 特定 over 結果 重寫 任務 .so 架構 延遲 定義:定義一個操作中算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變算法的結構即可重定義該算法中的某些特定步驟。 類型:行為類模式。 類圖: 事實上,模版方法是編程中一個經常用到的模式。先來看一個例子

設計模式 _第四招式_模版方法模式

一、定義 定義一個操作中的演算法框架,而將一些步驟延遲到子類中。使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。模版方法模式確實非常簡單,僅使用了Java的繼承機制,是一種應用非常廣泛的模式。 模版方法模式通用類圖如下: AbstractClass叫做抽象模

Java_50_回撥的實現_模版方法模式

回撥的實現 CallBack Hook ---------------------------------------------------- public class Test {//父類     public void paint() { &n

模版方法模式(Template Method)

1、概念 在模板模式(Template Pattern)中,一個抽象類公開定義了執行它的方法的方式/模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行。這種型別的設計模式屬於行為型模式。 2、模式結構 抽象類(AbstractClass): 定義一組基本方法供子類實現

設計模式 --- 模版方法模式

1.定義 定義一個操作中的演算法框架,而將一些步驟延遲到子類中,使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。   2.使用場景 1。多個子類公有的方法並且邏輯相同 2。重要、複雜的演算法,可以把核心演算法設計為模版,周邊的相關細節功能則由各個子類

Java 工廠方法模式的簡單示例

通過 style java 實例 對象 clas implement 屬於 決定 工廠方法模式:也叫工廠模式,屬於類創建型模式,工廠父類(接口)負責定義產品對象的公共接口,而子類工廠則負責創建具體的產品對象。 目的:是為了把產品的實例化操作延遲到子類工廠中完成,通過工廠子類

設計模式(九)—— 模版方法模式

一、含義 在一個方法中定義一個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。通俗講,就是當你的程式中,有多個類,方法是相同的,只是具體實現有差異時,就可以把這多個類使用模板方法模式進行封裝。 二、要點 1.模板方法只定

ES6設計模式模版方法模式

這是一個常用的模式,也是一個容易理解的模式,我從這裡面認識了什麼叫鉤子方法。 模版方法模式,很簡單就是就是父類中對演算法進行封裝,子類中新增子集的方法做不同實現,並且父類中可以設定鉤子函式,子類通過呼叫鉤子函式控制父類的演算法流程。注意這裡還有一個原則,避免物件之間過度依賴。會造成專案混亂,要遵循最少知識原則

設計模式總結之TemplateMethod Pattern(模版方法模式

目錄 建立型設計模式: 結構型設計模式: 行為型設計模式: TemplateMethod Pattern(模版方法模式) 意圖 定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個演算法的結構即可重定義該演算法的

模版方法模式,迭代器模式,組合模式,狀態模式,代理模式

1.模版方法模式:在一個方法中定義一個演算法的骨架,而將一些步驟延遲到子類中,模版方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟,還可以提供hook()讓子類決定是否執行某些步驟。比如sort中的Comparable介面。 2.迭代器模式就是集合的迭代器 3.組合模式

C++ 模版方法模式

簡述 模版方法模式(Template Method Pattern)定義一個操作中演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。 | 模式結構 UML 結構圖: 抽象類(

設計模式系列之四_策略模式模版方法模式(Template method)

1.策略模式 1.1 策略模式   策略模式定義了一系列的演算法,並將每一個演算法封裝起來,而且使它們還可以相互替換。 策略模式讓演算法獨立於使用它的客戶而獨立變化。   策略模式屬於物件的行為模式。其用意是針對一組演算法,將每一個演算法封裝到具有 共同介面的獨立的類中,

springmvc中的設計模式---模版方法模式

如果不使用模板方法模式,那麼對於ResourceBundleViewResolver、ThymeleafViewResolver等子類來說,都需要實現快取的操作,就造成了程式碼的大量冗餘;並且在一個類中同時實現了快取以及解析ViewName的功能,也違反了設計模式的單一職責的原則。

java模板方法模式

模版方法模式是所有模式中最常見的幾個模式之一,是基於繼承的程式碼複用的基本技術。 模板方法模式需要開發抽象類和具體子類的設計師之間的協作。一個設計師負責給出一個演算法的輪廓和骨架,另一些設計師則負責給出這個演算法的各個邏輯步驟。代表這些具體邏輯步驟的方法稱作基