...

Hallo seit langem mal wieder,

habe folgendes (Design-)“Problem”:

Um kurz zu erklären, um was es geht: Ein Java-Programm holt sich eine XML-Datei von einem HTTP-Server. In dieser ist eine Liste von Kategorien enthalten (nach Auswahl einer Kategorie im UI können passend zur Kategorie weitere Informationen angezeigt werden) die bislang ungefähr so aussah:
[XML]<?xml version="1.0" encoding="UTF-8" standalone="yes"?>



[/XML]

Mittlerweile ist es so, dass eine Kategorie auch Unterkategorien enthalten kann (beliebige Pfadlängen möglich):
[XML]<?xml version="1.0" encoding="UTF-8" standalone="yes"?>










[/XML]

Als es noch keine untergeordneten Kategorien gab, hat die folgende Klasse eine Kategorie repräsentiert:


	private int id;
	private String name;

	public Category(int id, String name) {
		setId(id);
		setName(name);
	}


	public int getId() {
		return id;
	}

	public void setId(int id) {
		if (id < 0) {
			throw new IllegalArgumentException("param must be >=0");
		}
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		if (name == null) {
			throw new NullPointerException("param must not be null!");
		}
		this.name = name;
	}

}```

Jetzt will ich die Klasse Category so umschreiben, dass sie ihren evtl. vorhandenen Parent bzw. ihre Children mir über get-Methoden liefern kann.

Die XML wird ungefähr folgendermaßen rekursiv ausgelesen (Pseudo-Code):
```rootelement = ...; // damit bekomme ich das Root-Element der XML-Datei (<categories>)
readChildren(rootelement);

function readChildren(element) {
	children = element.getChildren();
	// Aus dem <category>-Element eine neue Instanz von Category erstellen und evtl. zu einer Liste hinzufügen?
	for (children : child) {
		readChildren(child);
	}
	
}```

Jede Instanz soll ihren Parent (die übergeordnete Kategorie) und ihre Children (die untergeordneten Kategorien) kennen und mir über irgendwelche get-Methoden zurückliefern können.
Jetzt fehlt mir allerdings die Idee, wie ich das ganze sinnvoll und mit gutem Code-Design umsetzen kann.
Später soll diese Kategorieliste in einem JTree dargestellt werden, möchte es aber trotzdem unabhänig von irgendwelchen Swing-Models machen.
Auch sollen die ganzen Kategorien über eine List verfügbar gemacht werden. Wäre es hier sinnvoll, dass eine Liste nur mit den Kategorien der obersten Schicht erstellt wird, und später im Code für bspw. die GUI dann so etwas wie getChildren() aufgerufen wird?

Ich habe mir auch schon überlegt, in den Konstruktor eine Variable für den Parent einzubauen, der auch null sein kann. Doch dann frage ich mich wieder, wie eine Category an ihre Children kommen soll.
Evtl. auch eine addChildren-Methode?

Mir fehlt hier völlig die Idee, wie ich das einigermaßen sinnvoll lösen könnte. Habe sowas in der Art noch nicht machen müssen. Wäre nett, wenn ihr mir auf die Sprünge helfen könntet! :-)

Gruß und Danke,
pcworld
PS: Ich weiß, der Post ist evtl. etwas durcheinander...

Edit: Wäre nett, wenn ein Moderator den Titel des Threads nach dem Titel dieses Post umbenennen könnte. Ich bin vorher aus Versehen beim Schreiben des Titels auf die Entertaste gekommen, als der Post noch nicht fertig war.

schau dir mal http://en.wikipedia.org/wiki/Composite_pattern an

Danke, habe mir das mal angeschaut.
Aber irgendwie löst dieses Pattern mein Problem nicht so ganz: Jede Kategorie soll gleichzeitig eine Kategorie als auch ein Container (“Composite”) sein. Auch wenn eine Kategorie beim Einlesen der XML noch keine untergeordneten Kategorien hat, soll trotzdem noch die Möglichkeit bestehen, später Children dazufügen zu können.
Eine Kategorie sollte auch ihren Parent (die übergeordnete Kategorie) kennen.

Entschuldigt mir bitte den Crosspost: http://www.java-forum.org/allgemeine-java-themen/105544-designproblem-parent-children-beziehungen-klassen.html

Ich bin jetzt zu folgender Lösung gekommen:

import java.util.List;

public class CategoryList {

	private List<Category> categories = new ArrayList<Category>();

	public List<Category> getCategories() {
		return categories;
	}

	public void addCategory(Category category) {
		if (!categories.contains(category)) {
			category.setParent(this);
			categories.add(category);
		}
	}

	public void removeCategory(Category category) {
		categories.remove(category);
	}

}```

```import java.util.List;

public class Category extends CategoryList {

	private int id;
	private String name;

	private CategoryList parent;

	public Category(int id, String name, String desc, String img) {
		setId(id);
		setName(name);
		setDesc(desc);
		setImg(img);
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		if (id < 0) {
			throw new IllegalArgumentException("param must be >=0");
		}
		this.id = id;
	}
	public String getName() {
		return name;
	}

	public void setName(String name) {
		if (name == null) {
			throw new NullPointerException("param must not be null!");
		}
		this.name = name;
	}
	
	protected void setParent(CategoryList category) {
		this.parent = category;
	}

	public CategoryList getParent() {
		return parent;
	}

}```