DatenEinlesen -> GraphModel [Singleton]
Soweit sind wir uns schonmal einig.
Wie du schon selbst überlegt hast, halte auch ich es für sauberer die Schnittstelle zwischen deinem GraphModel und einem TreeModel in eine eigene Adapterklasse auszulagern, gleiches gilt für die Anbindung an GraphLibs. Das macht es etwas übersichtlicher wenn neue Adapter hinzukommen und einfacher wenn welche mal rausfliegen sollten und entspricht eher dem Konzept der Kapselung.
Wofür diu im einzelnen alles Adapter benötigst, weißt du selbst am besten. Ich weiß ja nicht was du später alles in einem JTree darstellen möchtest. Wenn du mehrere unterschiedliche Ansichten über JTree realisierst musst du slebst mal sehen ob du jeweils nen Adapter schreibst oder vielleicht einen Adapter so parametrisieren kannst, dass er für alles herhalten kann. Das Gefühl dafür bekommst du mit der Zeit von selbst, wenn dein erster Adapter läuft. Evtl. würde es sich auch anbieten einen generischen TreeModelAdapter zu basteln und auf den noch weitere Adapter für die unterschiedlichen JTree-Ansichten aufzusetzen. Möglichkeiten gibts da viele, aber das hängt eben immer alles von deinen Anforderungen ab.
Was die Dapter zu den Graphlibs angehst sind die alle so speziell, dass du für jede nen Adapter brauchen wirst. Ich weiß ja nicht wieviele verschiedene Libs du da verwenden willst. Bei JGo und ich glaube auch bei JGraph hast du im Model bereits die Instanzen der visuellen Nodes und Links drin, wogegen prefuse zwischen seinen eigenen Datenobjekten und ihren grafischen Repräsentationen unterschiedet, also noch eine Abstraktionseben mehr hat.
Was du in dein GraphModel so alles treibst, wird sich mit der Zeit ergeben. Ich habe z.B. folgende Situation in meinem Bereich:
Ein Objekt kann andere Objekte als Input und Output definiert haben. Nun kann es vorkommen dass Node A einen Node B als Output definiert hat, Node B hat aber Node A nicht als Input definiert. Das sind so Sachen die über die Farbe der Kanten (dient bei mir also als Kantengewicht) visualisiert werden. Jeder Node kann dabei beliebig viele Inputs und Outputs haben und damit fallen die klassischen Adjazenzlisten und -matrizen schonmal weg als Möglichkeit die Kanten darzustellen.
So habe ich bei mir in der Datenklasse Hashtables, wo die Knoten als Key benutzt werden und als Value eine Map beinhaltet, die die verbundenen Knoten als Key und das Kantengewicht (in meinem Fall über einen Integer, bei dir dann über dein Kantenobjekt) als Value enthalten.
Knoten -> Map( (Knoten -> Kante), (Knoten -> Kante), ... )
Knoten -> Map( (Knoten -> Kante), (Knoten -> Kante), ... )
...
Man muss da ein wenig kreativ sein. Im ersten Schritt setzt man sowas gerne als Brute-Force-Algorithmus um, bis dann die Performance so in die Knie geht, weil man alle Nase lang über alle Objekte iteriert. Dann ist es an der Zeit sich ein paar etwas intelligentere Datenstrukturen zu basteln, die gewisse immer wieder benötigte Infos schon bereit halten, so dass ich sie nur einmal erzeugen muss.
Ich muss aber gestehen auch kein Mathe-Ass zu sein. Für einige Sachen mag es spezielle Algos geben, die ich nicht kenne, die das ganze nochmal beschleunigen könnten. Naja.. nobody's perfect
