2008-10-07 37 views
0

我有一種樹形結構,它表示地圖中圖層的層次結構,除以圖層和類別的類型。每個節點對於不同類型的層可以是不同的類(但是所有節點實現通用接口)。將一種類型的樹結構轉換爲另一種類型的設計模式?

我需要將該類轉換爲ASP.NET TreeView控件。輸入樹中的每個節點都是輸出樹中的一個節點,其屬性集取決於節點的類型。我不希望輸入樹類知道UI類,所以我不能在它們中寫入「ToTreeViewNode()」方法。目前有4種類型的混凝土節點類,其中2種是複合節點(包含子節點),其中2種是葉節點。這可能在未來發生變化。

感覺就像這裏有一個設計模式使用癢,你能幫我找到它是什麼?

+0

請提供有關我們在此討論的節點類型的詳細信息...... – jop 2008-10-07 08:09:41

回答

2

A Visitor也許,要走輸入樹並建立相應的UI樹?

+0

這樣做的缺點是每次原始模型在結構上發生變化時都需要重建樹 – 2008-10-08 12:58:15

0

這聽起來像是你想在這裏使用Model-View-Controller。您的樹形圖結構可能是Model,View是TreeView控件 - 您可能需要添加某種類型的Controller類來管理兩者之間的交互。

+0

是的,但我正在談論遍歷樹的實際行爲。我試圖避免的是很多[「如果(節點是GroupLayerNode) 做到這一點,否則做」]。 – 2008-10-07 07:37:08

1

我的.NET是一個有點生疏,但你可以做的是創造TreeNodeCollection,可能樹節點的單獨的子類,讓他們訪問您的結構的分配 TreeNodeCollection到TreeViewControl的節點屬性。

TreeNodeCollection包裝器會將您的結構轉換爲TreeViewControl結構。 TreeNode類可能會包含對自己節點的引用,但會將節點轉換爲TreeNode。

在通過實現這兩個接口,你適應你的模型的接口與TreeViewControl使用一個換句話說,

如果使用訪問者模式來創建並行結構,你將不得不每次有時間運行更改。或者你仍然需要用TreeNode接口包裝你的節點。

Adapter pattern

0

希望有合適的你的問題:

從「奧賴利 - 爲有效的迭代設計界面設計模式」

你說普遍得到相關聯的這兩個模式樹:

  • 「分級列表」
  • 「樹圖」

本書的第6章約12個設計模式用於顯示覆雜的數據。

我沒有找到這些模式的任何鏈接,所以我想你會需要在當地的圖書館檢查這本書。我發現這個網頁可能有一些圖片來幫助你,但我已經檢查過,它不包括那兩個,或者第6章的那些。 http://www.welie.com/patterns/

1

我不知道你想實現什麼,但(據我所知),我認爲,如果你要同時使用:

  1. 複合 - 爲節點(樹)
  2. 戰略 - 爲製圖 「algotithm」 的實施

所以你必須:

public class Node 
{ 
    public IDraw genericDrawing; 
    public Node[] Childs; 
    public Node() { //init you genericDrawinf } 
    public void Draw() 
    { 
     genericDrawing.Draw(this); 
     foreach (Node child in Childs) 
     { 
     child.Draw(); 
     } 
    } 
} 

public interface IDraw 
{ 
    void Draw(Node node); 
} 
public class SimpleDraw : IDraw 
{ 
    public void Draw(Node node) 
    { 
     // code your stuf in here. 
    } 
} 

偉大的事情是:

  1. 你不需要遞歸繪製每一個繪畫本身
  2. 運行期間或對象的實例時您的繪圖策略可能會改變
  3. 你可以擴展每一個你的類層次結構中沒有依賴關係。
  4. 把它想在你的Web控件形成
  5. 此外,每個對象(SRP)單一職責原則

享受。

相關問題