設計模式(八) 模板方法模式

2021-09-01 08:57:46 字數 2449 閱讀 8750

設計模式(八)——模板方法模式

這幾天雜七雜八的事有點多,停了幾日,今日繼續,今天講最簡單的模板方法,但是卻是用的比較廣泛的。首先來明確下概念吧,模板方法的寫法是這樣,準備乙個抽象類,將部分邏輯以具體方法以及具體建構函式的形式實現,然後宣告一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現,這就是模板方法模式的用意。模板方法模式需要開發抽象類和具體子類的設計師之間的協作。乙個設計師負責給出乙個演算法的輪廓和骨架,另一些設計師則負責給出這個演算法的各個邏輯步驟。代表這些具體邏輯步驟的方法稱做基本方法(primitive method);而將這些基本方法彙總起來的方法叫做模板方法(template method),這個設計模式的名字就是從此而來。

具體來看**吧,大家比較熟悉的單元測試junit的原始碼在設計上就應用了模板方法模式,下面我來模擬一下,記住,只是模擬乙個大概的流程,表達乙個思路,實際上真正的junit的原始碼要複雜一點。

首先我們知道,單元測試一般有三個流程,即資料初始化階段,實際測試階段,資料**階段,我們設計時會把這些方法都寫成抽象的,因為我們並不知道你要測什麼,你需要什麼資源,得由具體測試的人去實現這些方法。

package com.gy.designpattern.template;

/** * classname:mytestcase

* function: 自定義乙個測試的模板.

* reason: todo add reason.

* date: 2012-7-17 下午4:14:20

* @author gongyong

* @version

* @since jdk 1.6

* @see

*/public abstract class mytestcase

protected void runtest() throws throwable

protected void teardown() throws exception

//具體的模板方法,定義出邏輯骨架

public void runbare() throws throwable

}

下面,我們假如要測試乙個獲取訊息的方法,那我們會這麼寫這個測試

package com.gy.designpattern.template;

/** * classname:messagetest

* function: 抽象模板的繼承,這裡實現具體的基本方法.

* reason: todo add reason.

* date: 2012-7-17 下午4:16:36

* @author gongyong

* @version

* @since jdk 1.6

* @see

*/public class messagetest extends mytestcase

/*** 第二步,具體的測試.

* @see com.gy.designpattern.template.mytestcase#runtest()

*/protected void runtest() throws throwable

/***第三步,測試完畢,資源**.

* @see com.gy.designpattern.template.mytestcase#teardown()

*/public void teardown() throws exception

}

具體的測試我就不寫了,我就用一句話代替了,這個應該懂的。到這裡其實就已經寫完了。當然,你還可以寫其他任何的測試,只不過是都繼承自這個抽象類,然後具體實現這三個方法而已。這就是模板方法的用處。最後我們執行這個單元測試,模擬個執行器:

package com.gy.designpattern.template;

/** * classname:client

* function: 模擬乙個單元測試的執行器.

* reason: todo add reason.

* date: 2012-7-17 下午4:25:37

* @author gongyong

* @version

* @since jdk 1.6

* @see

*/public class client

}

實際上,我們看junit的原始碼,它不是這麼直接的,但是他就是按照這個思路設計的,它只不過還拐了幾個彎而已,比如我們在繼承類裡實現了乙個 protected void runtest()方法,實際上我們在寫的時候就不是這麼寫的,名字我們可以隨便起(3.x以前的名字必須帶test),然後junit用介面卡模式將這個方法配成了 runtest方法,其實還是一樣。

好吧,就說到這裡。

設計模式(八)模板方法模式

它的定義為 定義乙個操作中的演算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變乙個演算法的結構即可重新定義該演算法的某些特定步驟。說的通俗一點,就是為子類設計乙個模板以便於子類復用裡面的方法。為了避免子類惡意修改方法的實現細節,一般模板方法模式都會在方法上加final。我們以泡茶和衝咖啡為例...

設計模式學習(八) 模板方法模式

這是個人學習程式設計模式的系列學習筆記第八篇。採用qt creator進行編寫,但盡量採用c 基礎語法。模板方法模式 template method 定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。如果有乙個場景,從高層次來...

設計模式學習(八)模板方法模式

在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。別呼叫我們,我們會呼叫你。也就是高層元件來決定什麼時候呼叫低層元件。我們需要製作咖啡和茶。咖啡的製作步驟 1.把水煮沸 2.用沸水沖泡咖啡 3.把咖啡倒入杯子 4....