客製化TeeeNode(二)-建造Tree(Builder/Factory)

  • 1639
  • 0
  • 2010-07-19

摘要:客製化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

可達到分離生成、建構、表示三段程式碼的功用,並提高擴充性、彈性以及可維護度

分享