小A:“通常我們會遇到這樣的一個問題:我們知道一個算法所需的關鍵步聚,並確定了這些步聚的執(zhí)行順序。但是某些步聚的具體實現(xiàn)是未知的,或者是某些步聚的實現(xiàn)與具體的環(huán)境相關。”
大B:“模板方法模式把我們不知道具體實現(xiàn)的步驟封裝成抽象方法,提供一些按正確順序調用它們的具體方法(這些具體方法統(tǒng)稱爲模板方法),這樣構成一個抽象基類。子類通過繼承這個抽象基類去實現(xiàn)各個步聚的抽象方法,而工作流程卻由父類來控制。”
小A:“什麼是模板方法模式?”
大B:“定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。TemplateMethod使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。”
小A:“要如何去實現(xiàn)它哩?”
大B:“模板模式,是衆(zhòng)多模式之中用得比較多的模式,在具體的應用中,我們已經(jīng)經(jīng)意或者不經(jīng)意的採用了這種模式。其是先寫定義,後實現(xiàn),然後再調用,將實現(xiàn)與調用分開,從而利用增強了程序的延展性。模板模式是利用了虛函數(shù)的多態(tài)性,我們可以實現(xiàn),也可以不實現(xiàn)。”
publicabstractclassAbstractOrder{
publicOrderplaceOrder(intcustomerId,ListorderItemList){
inttotal=0;
for(inti=0;igetSpendingLimit(customerId)){
thrownewBusinessException(“超出信用額度”+getSpendingLimit(customerId));
}
intorderId=saveOrder(customerId,total,orderItemList);
returnnewOrderImpl(orderId,total);
}
publicabstractintgetOrderItemPrice(OrderItemorderItem);
publicabstractintgetSpendingLimit(intcustomerId);
publicabstractintsaveOrder(intcustomerId,inttotal,ListorderItemList);
}
rendercode();
AbstractOrder在placeOrder方法中確定了定單處理的邏輯,placeOrder方法也稱爲模板方法。在placeOrder中調用了三個抽象方法。子類只需要去實現(xiàn)三個抽象方法,而無需要去關心定單處理的邏輯。