定乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。template method使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。模板模式中有兩個角色,抽象模板角色定義了乙個或多個抽象操作以便讓子類實現,定義並實現了乙個模板方法,這個方法包含了一些不可改變的方法執行順序。
具體模板角色實現父類定義的乙個或多個抽象方法,每乙個抽象模板角色都可以有任意多個具體模板角色與之對應,而每乙個具體模板角色都可以給出這些抽象方法的不同實現。
模板模式中,在抽象模板中定義了方法的執行順序,而方法的實現可以選擇讓子類去定製化;另外,統一的不變的方法可以放在抽象模板類中,這樣子類可以共用。
模板模式中還經常會出現鉤子方法,一般是由抽象類給出方法的空實現,然後子類進行覆寫。這種空的鉤子方法叫做「do nothing hook」。
鉤子方法放到模板方法中,就可以實現生命週期中方法的自定義,例如beforecreate、beforeupdate、afterupdate、aftercreated等。
httpservlet中應用了模板方法模式,其中httpservlet是抽象模板角色。
service()是抽象方法,do開頭的方法,例如doget、dopost是可以由子類定製化的方法。
service()方法如下:
}}方法的執行上下文在service()規定好,剩下的doget等方法可以自定製。
這裡的模板方法service沒有final修飾,所以這個方法實際上也能進行定製。
場景:寫作文,作文是有固定模板的,例如必須有開頭,內容主體和結尾。並且三者編寫的順序不能打亂,不能出現先寫結尾再寫開頭的情況。
三者的順序就是演算法的骨架,而三者的具體實現就會由具體子類去定製化實現,因為每個人寫出的作文內容都是不一樣的。
根據當前場景設計抽象模板角色:
package com.faith.net.strategy.pay.template;
/** * 抽象模板類
*/public abstract class article
/*** 寫文章開頭
*/public abstract void writehead();
/*** 寫文章主體
*/public abstract void writebody();
/*** 寫文章結尾,不一定非得是abstract修飾,只要能被子類重寫就可以
*/protected void writetail() ;
/*** 子類公用的方法
*/public void writeseparateline()
/*** 前置鉤子方法
*/public void beforewritehook()
/*** 後置鉤子方法
*/public void afterwritehook()
}
新增具體實現,登黃鶴樓和登金陵鳳凰台。
package com.faith.net.strategy.pay.template;
/** * 登黃鶴樓 崔顥
*/public class huanghelou extends article
@override
public void writebody()
@override
public void writetail()
@override
public void beforewritehook()
@override
public void afterwritehook()
}
package com.faith.net.strategy.pay.template;
/** * 登金陵鳳凰台 李白
*/public class fenghuangtai extends article
@override
public void writebody()
@override
public void writetail()
@override
public void beforewritehook()
@override
public void afterwritehook()
}
測試類:
package com.faith.net.strategy.pay.template;
/** * 測試類
*/public class templatetest
}
模板方法模式
有這樣乙個場景 乙個演算法或流程,它的步驟以及步驟之間的順序是固定的,但具體的某一步可能有不同的實現。對於這麼乙個場景,可以建立多個類,各個類實現不同的實現,但是這樣的缺點是 易錯 難改,易錯 應為步驟和順序是固定的,而且在每個類中都要寫一遍,程式設計師怎有心情不好的時候,就有可能把其中某一步給寫錯...
模板方法模式
模板方法模式 定義乙個演算法框架,將裡面的操作步驟推遲到子類中去執行,這樣使得子類不用改變框架,只需改變某些操作步驟方法 ifndef test h define test h include include using namespace std class test virtual test v...
模板方法模式
模板方法模式 在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法的某些步驟。還可以使用鉤子對可選部分進行判斷。include include using namespace std class caffeinebeverage ...