標籤:設計模式 物件導向 實用函數編程 函數編程 f#
8.4.3 C# 決策樹
在第五章,我們討論過 F# 的差別聯合和 C# 中的類階層之間的關係。在此樣本中,我們將使用另一個種類階層表示決策樹的節點,派生兩個額外的類來表示兩種不同情況(最後結果和查詢)。
在函數式版本中,所有的處理邏輯都是在 testClientTree 函數中分別實現的。我們以物件導向的風格,使用訪問者模式(visitor pattern)(在第七章討論過),雖然也能做到這一點,但這並不是正宗的物件導向解決方案。這裡,我們不需要實現函數分別處理決策樹,所以,可以用更一般的物件導向技術,繼承和虛方法。
清單 8.17 顯示了基類(Decision)和兩個衍生類別中較簡單的一個(ResultDecision),表示最終結果。
清單 8.17 物件導向的決策樹 (C#)
abstract class Decision {
public abstract void Evaluate(Clientclient); [1]
}
class ResultDecision : Decision {
public bool Result { get; set;}
public override void Evaluate(Clientclient) { [2]
Console.WriteLine("OFFER A LOAN: {0}", Result ? "YES" :"NO");
}
}
這部分代碼相當簡單。基類只包含一個虛方法[1],將在衍生類別中實現,檢查客戶並輸出結果。在表示最終結果的類中的實現[2],輸出結果到控制台。
更重要的部分是實現表示查詢的類。問題是我們需要為每個具體查詢提供不同的代碼(檢查收入,當前工作年限,等等)。我們可以為每個查詢建立一個新的衍生類別,與 Evaluate 方法的實作類別似,但感覺並不是好的解決方案,因為,涉及代碼重複。更好的實現方法是使用模板方法(template method)的設計模式。
8.4.3 C# 決策樹