小A:“什麼是‘開閉原則’?”
大B:“是指一個軟件實體應該對擴展開放,對修改關閉。也就是說軟件實體必須是在不被修改的情況下被擴展。模板方法模式意圖是由抽象父類控製頂級邏輯,並把基本操作的實現推遲到子類去實現,這是通過繼承的手段來達到對象的複用,同時也遵守了開閉原則。父類通過頂級邏輯,它通過定義並提供一個具體方法來實現,也稱之為模板方法。通常這個模板方法才是外部對象最關心的方法。在前麵的訂單處理例子中,publicOrderplaceOrder(intcustomerId,ListorderItemList)這個方法才是外部對象最關心的方法。所以它必須是public的,才能被外部對象所調用。子類需要繼承父類去擴展父類的基本方法,但是它也可以覆寫父類的方法。如果子類去覆寫了父類的模板方法,從而改變了父類控製的頂級邏輯。這違反了‘開閉原則’。我們在使用模板方法模式時,應該總是保證子類有正確的邏輯。所以模板方法應該定義為final的。所以AbstractOrder類的模板方法placeOrder方法應該定義為final。”
代碼:
大B:“因為子類不能覆寫一個被定義為final的方法。從而保證了子類的邏輯永遠由父類所控製。模板方法模式中,抽象類的模板方法應該聲明為final的。”
(本章完)