理解了模板方法的定義之後,自然實現模板方法也不是什麼難事了,下面以生活中炒蔬菜為例來實現下模板方法模式。在現實生活中,做蔬菜的步驟都大致相同,如果我們針對每種蔬菜類定義乙個燒的方法,這樣在每個類中都有很多相同的**,為了解決這個問題,我們一般的思路肯定是把相同的部分抽象出來到抽象類中去定義,具體子類來實現具體的不同部分,這個思路也正式模板方法的實現精髓所在,具體實現**如下:
//view code客戶端呼叫
class
client
}public
abstract
class
vegetabel
//第一步倒油
public
void
pouroil()
//把油燒熱
public
void
heatoil()
//油熱了之後倒蔬菜下去,具體哪種蔬菜由子類決定
public
abstract
void
pourvegetable();
//開發翻炒蔬菜
public
void
stir_fry()
}//菠菜
public
class
spinach : vegetabel
}//大白菜
public
class
chinesecabbage : vegetabel
}
在上面的實現中,具體子類中重寫了匯入蔬菜種類的方法,因為這個真是燒菜方法中不同的地方,所以由具體子類去實現它。
實現完模板方法模式之後,讓我們看看模板方法的類圖結構,以理清該模式中類之間的關係,具體類圖如下:
模板方法模式中涉及了兩個角色:
下面讓我們繼續分析下模板方法的優缺點。
優點:
實現了**復用
能夠靈活應對子步驟的變化,符合開放-封閉原則
附:在.net中模板方法的應用也很多,例如我們在開發自定義的web控制項或winform控制項時,我們只需要重寫某個控制項的部分方法。
到這裡,模板方法的介紹就結束了,模板方法模式在抽象類中定義了演算法的實現步驟,將這些步驟的實現延遲到具體子類中去實現,從而使所有子類復用了父類的**,所以模板方法模式是基於繼承的一種實現**復用的技術。
模板方法模式
有這樣乙個場景 乙個演算法或流程,它的步驟以及步驟之間的順序是固定的,但具體的某一步可能有不同的實現。對於這麼乙個場景,可以建立多個類,各個類實現不同的實現,但是這樣的缺點是 易錯 難改,易錯 應為步驟和順序是固定的,而且在每個類中都要寫一遍,程式設計師怎有心情不好的時候,就有可能把其中某一步給寫錯...
模板方法模式
模板方法模式 定義乙個演算法框架,將裡面的操作步驟推遲到子類中去執行,這樣使得子類不用改變框架,只需改變某些操作步驟方法 ifndef test h define test h include include using namespace std class test virtual test v...
模板方法模式
模板方法模式 在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法的某些步驟。還可以使用鉤子對可選部分進行判斷。include include using namespace std class caffeinebeverage ...