首页 > 代码库 > 8.4.3 C# 决策树
8.4.3 C# 决策树
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# 决策树