小A:“通常我們會遇到這樣的一個問題:我們知道一個演算法所需的關鍵步聚,並確定了這些步聚的執行順序。但是某些步聚的具體實現是未知的,或者是某些步聚的實現與具體的環境相關。”
大B:“模板方法模式把我們不知道具體實現的步驟封裝成抽象方法,提供一些按正確順序呼叫它們的具體方法(這些具體方法統稱為模板方法),這樣構成一個抽象基類。子類透過繼承這個抽象基類去實現各個步聚的抽象方法,而工作流程卻由父類來控制。”
小A:“什麼是模板方法模式?”
大B:“定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。TemplateMethod使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。”
小A:“要如何去實現它哩?”
大B:“模板模式,是眾多模式之中用得比較多的模式,在具體的應用中,我們已經經意或者不經意的採用了這種模式。其是先寫定義,後實現,然後再呼叫,將實現與呼叫分開,從而利用增強了程式的延展性。模板模式是利用了虛擬函式的多型性,我們可以實現,也可以不實現。”
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中呼叫了三個抽象方法。子類只需要去實現三個抽象方法,而無需要去關心定單處理的邏輯。