Domanda

Ho una sorta di struttura ad albero che rappresenta una gerarchia di livelli in una mappa, divisa per tipi di livelli e categorie. Ogni nodo può essere una classe diversa per diversi tipi di livelli (ma tutti i nodi implementano un'interfaccia comune).

Devo convertire quella classe in un controllo TreeView ASP.NET. Ogni nodo nella struttura di input è un nodo nella struttura di output, con le proprietà impostate che dipendono dal tipo di nodo. Non voglio che le classi dell'albero di input conoscano le classi dell'interfaccia utente, quindi non posso scrivere un " ToTreeViewNode () " metodo in loro. Esistono attualmente 4 tipi di classi di nodi concreti, 2 di loro sono compositi (contengono nodi figlio) e 2 di loro sono foglie. Questo potrebbe cambiare in futuro.

Sembra che ci sia un modello di design qui prurito da usare, puoi aiutarmi a trovare di cosa si tratta?

È stato utile?

Soluzione

Un Visitatore forse, per camminare sull'albero di input e costruire l'albero dell'interfaccia utente corrispondente?

Altri suggerimenti

Il mio .NET è un po 'arrugginito, ma quello che potresti fare è creare una sottoclasse separata di TreeNodeCollection e possibilmente TreeNode, dare loro accesso alla tua struttura e assegnare un tuo TreeNodeCollection alla proprietà Nodes di TreeViewControl.

Il wrapper TreeNodeCollection convertirà la tua struttura in una struttura TreeViewControl. La classe TreeNode conterrà probabilmente un riferimento ai tuoi nodi, ma convertirà i tuoi nodi in TreeNodes.

In altre parole, implementando queste due interfacce, si adatta l'interfaccia del proprio modello a quella utilizzata da TreeViewControl,

Se si utilizza il modello Visitor per creare una struttura parallela, è necessario eseguirlo ogni volta che si verifica una modifica. Oppure dovresti comunque avvolgere il tuo nodo con l'interfaccia TreeNode.

Vedi Pattern dell'adattatore

Non sono sicuro di ciò che stai cercando di ottenere, ma (come ho capito) penso che se userai entrambi:

  1. Composito - per i nodi (albero)
  2. Strategia - per l'implementazione del disegno " algotithm "

quindi avrai:

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.
    }
}

il bello è:

  1. non hai bisogno di disegnare ricorsivamente ognuno disegnando se stesso
  2. la tua strategia di disegno può cambiare durante il runtime o durante un'istanza di un oggetto
  3. puoi scalare ciascuna gerarchia di classi senza alcuna dipendenza nell'altra struttura.
  4. pensalo come i controlli nei tuoi moduli Web
  5. inoltre, ogni oggetto è (SRP) Single Responsibility Principle

Enjoy.

Mi sembra che tu voglia usare Model-View-Controller qui. La struttura della tua mappa ad albero è probabilmente il modello, la vista è il controllo TreeView - probabilmente dovrai aggiungere una classe Controller di qualche tipo per gestire l'interazione tra i due.

Spero di avere la domanda giusta:

Da " O'Reilly - Progettazione di schemi di interfacce per un efficace disegno di iterazione "

Hai questi due schemi che generalmente vengono associati agli alberi:

  • " Elenchi a cascata "
  • " Treemap "

Il capitolo 6 di questo libro, come una decina di progetti, illustra i modelli da utilizzare per mostrare dati complessi.

Non ho trovato alcun link a questi schemi, quindi immagino che dovrai controllare il libro nella biblioteca locale. Ho trovato questa pagina web che potrebbe avere alcuni patern per aiutarti ma ho controllato e non include quei due, o quelli del capitolo 6. http://www.welie.com/patterns/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top