摘要:客製化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
可達到分離生成、建構、表示三段程式碼的功用,並提高擴充性、彈性以及可維護度