模板方法模式

2021-09-20 05:39:54 字數 1297 閱讀 8422

開發軟體時乙個常見的情況是有乙個通用的演算法,只是步驟上略有不同。我們希望不同的 實現能夠遵守通用模式,保證它們使用了同乙個演算法,也是為了讓**更加易讀。一旦你 從整體上理解了演算法,就能更容易理解其各種實現。

模板方法模式是為這些情況設計的:整體演算法的設計是乙個抽象類,它有一系列抽象方法,代表演算法中可被定製的步驟,同時這個類中包含了一些通用**。演算法的每乙個變種 由具體的類實現,它們重寫了抽象方法,提供了相應的實現。 

讓我們假想乙個情境來搞明白這是怎麼回事。假設我們是一家銀行,需要對公眾、公司和 職員放貸。放貸程式大體一致即驗明身份、信用記錄和收入記錄。這些資訊**不一, 衡量標準也不一樣。你可以檢視乙個家庭的賬單來核對個人身份;公司都在官方機構註冊 過,比如美國的sec、英國的companies house。 

圖1 使用模板方法模式描述申請貸款過程

圖2 員工申請貸款是個人申請的一種特殊情況

圖3 員工申請貸款的例子

正如讀者所見, 這裡沒有使用一系列的抽象方法, 而是多出一些屬性:identity、credithistory 和incomehistory。每乙個屬性都實現了函式介面criteria,該介面檢查一項標準,如果不達標就丟擲乙個問題域裡的異常。我們也可以選擇從check 方法返回乙個類來表示成功或失敗,但是沿用異常更加符合先前的實現圖4。

圖4  如果申請失敗,函式介面criteria 丟擲異常

圖5 company 類中的檢查方法

將行為分配給company 類的原因是各個國家之間確認公司資訊的方式不同。在英國,companies house 規範了註冊公司資訊的位址,但在美國,各個州的政策是不一樣的。

使用函式介面實現檢查方法並沒有排除繼承的方式。我們可以顯式地在這些類中使用lambda 表示式或者方法引用。

模板方法模式

有這樣乙個場景 乙個演算法或流程,它的步驟以及步驟之間的順序是固定的,但具體的某一步可能有不同的實現。對於這麼乙個場景,可以建立多個類,各個類實現不同的實現,但是這樣的缺點是 易錯 難改,易錯 應為步驟和順序是固定的,而且在每個類中都要寫一遍,程式設計師怎有心情不好的時候,就有可能把其中某一步給寫錯...

模板方法模式

模板方法模式 定義乙個演算法框架,將裡面的操作步驟推遲到子類中去執行,這樣使得子類不用改變框架,只需改變某些操作步驟方法 ifndef test h define test h include include using namespace std class test virtual test v...

模板方法模式

模板方法模式 在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法的某些步驟。還可以使用鉤子對可選部分進行判斷。include include using namespace std class caffeinebeverage ...