.NET独有的精巧泛型设计模式(2)
/// <typeparam name="K">Type of the node value.</typeparam>
class TreeNode<T,K> where T:TreeNode<T,K> where K: IComparable<K>
{
public T LeftChild { get; set; }
public T RightChild { get; set; }
public T Parent { get; set; }
public K Value { get; set; }
}
之后,实现任何一种特殊二叉树结构,比如RBTreeNode代表红黑树节点,可以这样:
class RBTreeNode : TreeNode<RBTreeNode,Int32>
{
/// <summary>
/// 树节点颜色,是否为红。
/// </summary>
public bool IsRed { get; set; }
public override string ToString()
{
return this.Value + "," + (this.IsRed ? "R" : "B");
}
}
这个是AVL树:
class AvlTreeNode : TreeNode<AvlTreeNode,Int32>
{
/// <summary>
/// 节点的平衡度
/// </summary>
public int Balance { get; set; }
public override string ToString()
{
return "Balance: " + Balance + ", Value: " + this.Value;
}
}
不但完全符合OCP原则,而且再也不需要as来强制转换节点类型了。
这肯定不是我的首创,其实.NET Framework中已经不少这样的设计,比如IComparable<T>接口。也有不少优秀的框架采用了类似的设计,比如大石头同学的ORM框架NewLife.XCode。
看上去也很简单吧,但是很多人思维还停留在面向对象语言刚诞生的阶段,还不习惯用这种设计模式。我认为这种写法足够典型和通用,足以得上一种设计模式,而且是.NET特殊优势,独特魅力。
说到设计模式,其实GOF提出的23种设计模式多年了,已经过时,出现了许多新模式(比如并发编程方面,参考Wiki Design Pattern)。旧有的模式中,有的已经包含在.NET语言特性中,有的模式实现方式已经改头换面。尤其在泛型出现后,许多模式的实现可以变得简洁许多,优雅许多。
不要一遍遍炒过去的冷饭,设计模式应该与时俱进,永远是充满新鲜活力的话题。
摘自 XiaoMing的点滴
相关新闻>>
- 发表评论
-
- 最新评论 进入详细评论页>>