摘要:客製化TeeeNode-(Builder)
1.問題
當我們使用客製化TeeeNode來建造Tree時,常遇到以下幾種狀況
- 客製化TeeeNode程式碼散落於UI(客戶端)中
- Tree的程式碼與客製化TreeNode強烈相依耦合、難以變動
- 客製化TeeeNode時,還需其他的建構過程,或給屬性值,導致生成客製化TeeeNode的過程相當繁瑣
2.解決方案
Builder Pattern可以解決上述問題,可以根據需求打造自己的TreeNodeBuilder
EX:
//建造者介面 interface ITreeBuilder { void BuildBaseTreeNodes(); void CreateTreeNodesByModel(); } //建造步驟 static class TreeBuilder { public static void BuildTree(ITreeBuilder pBuilder) { pBuilder.BuildBaseTreeNodes(); pBuilder.CreateTreeNodesByModel(); } }
可以視情況決定ITreeBuilder介面中是否要有一個屬性來取得建造後的結果
3.使用Builder Pattern不只解決了上述問題,也帶來了一些優點
- 分離建構與表示
- 控制建構過程
- 得到重用以及可替換的Builder
4.其他
- 搭配Factory(工廠)模式來產生不同的客製化TreeNode,可以達到封裝生成TreeNode的過程
EX:
//工廠 static class NodeFactory { internal static TreeNode BuildNode<T>(T pItem) where T : DomainObjectBase { CustomNode<T> node = null; node = new CustomNode<T>() { Element = pItem, PropertyName = DataModelQueryConst.DISPLAYNAME }; return node; } }
由於Builder Pattern 常伴隨著 Composite Pattern 所以可以使用下列的方式 來方便建造Tree,透過傳入一個Parent Node,來得知父節點物件。並完成加入到父節點的動作
internal static TreeNode BuildNodeByType<TNode, T>(T pItem, TreeNode pParentNode) where TNode : CustomNode<T>, new() where T : DomainObjectBase { TNode node = null; node = new TNode() { Element = pItem, PropertyName = DataModelQueryConst.DISPLAYNAME }; pParentNode.Nodes.Add(node); return node; } internal static TreeNode BuildNode<T>(T pItem, TreeNode pParentNode) where T : DomainObjectBase { CustomNode<T> node = null; node = new CustomNode<T>() { Element = pItem, PropertyName = DataModelQueryConst.DISPLAYNAME }; pParentNode.Nodes.Add(node); return node; }
5.結論
使用Factory(工廠)模式來生成客製化TreeNode,再運用Builder Pattern來建構Tree
可達到分離生成、建構、表示三段程式碼的功用,並提高擴充性、彈性以及可維護度