PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Visitor Pattern


T4ch0n4d3l
2008-08-07, 17:07:55
Hallo,

ich habe derzeit eine kleine Denksperre und hoffe, dass ihr mir eventuell etwas auf die Sprünge helfen könnt.

Ich habe 3 Klassen NeuronLayer, SynapseLayer und IOLayer, alle abgeleitet von der Superklasse AbstractLayer.
Die Layer haben sehr viele gemeinsame Funktionen, welche in AbstractLayer definiert sind. Jedoch hat jeder Layer auch eine Reihe eigene Funktionen, auf die ich von Zeit zu Zeit zugreifen muss.
Angenommen, ich habe eine Funktion
Component addLayer(AbstractLayer layer). Diese Funktion soll mir ein Layer in eine Component auflösen, abhängig von der konkreten Implementierung des Layers.
Da ich kein Freund von exzessiven instanceof und Typecasting bin, habe ich an das Visitor Pattern gedacht. Demzufolge habe ich ein Interface
interface Visitor {
void visit(NeuronLayer layer);
void visit(SynapseLayer layer);
void visit(IOLayer layer);
}
Nun hab ich aber das Problem, dass addLayer einen Rückgabewert hat. Wie kann ich den Rückgabewert innerhalb des Visitors setzen und läuft der Visitor synchron oder asynchron? Oder gibt es Alternativen zum Visitor ?

Ich möchte keine Funktion im Layer einbauen, die mir die Komponente liefert.

Danke im vorraus.

Markus

Trap
2008-08-07, 17:15:22
Man kann visit() auch so definieren:

Object visit(Something toVisit, Object arguments);

DocEW
2008-08-07, 18:29:59
Ich verstehe noch nicht, warum du nicht einfach folgendes machst:

Component addLayer(NeuronLayer layer)
Component addLayer(SynapseLayer layer)
Component addLayer(IOLayer layer)

wenn du sowieso
"abhängig von der konkreten Implementierung des Layers" bist
es sich nicht so anhört, als würden in Zukunft noch wahnsinnig viele weitere Layer dazu kommen.

T4ch0n4d3l
2008-08-07, 18:42:37
Erstmal danke für die Antworten. :smile:

@DocEW
Es gibt eine Klasse NeuronalesNetz, welche die Layer als Implementierung des Interfaces ILayer in eine ArrayList speichert. NeuronalesNetz kann nun Kalkulationen anstellen, für welche das Interface ausreicht und interessiert sich nicht, ob Layer ein NeuronLayer oder dergleichen ist. Die konkrete Klasse eines Layers ist demzufolge nicht mehr bekannt.
Die Oberfläche soll aber entsprechende Konfigurationspanel zur Verfügung stellen, mit welchen die Layer konfiguriert werden. Die notwendingen Funktionen zur Konfiguration unterscheiden sich von Layer zu Layer, genauso wie das Konfigurationspanel selber. Deshalb suche ich eine möglichst elegante Lösung, die konkrete Implementierung von ILayer bzw AbstractLayer herauszufinden, ohne instanceof und typecasting.

Die Implementierung von NeuronalesNetz und er Oberfläche soll strikt getrennt sein, wesshalb eine Funktion wie getComponent() im Layer unzulässig ist.

Die Lösung von Trap würde funktionieren, aber ich denke mal, dass es noch einen eleganteren Weg gibt.

Mfg,
Markus