interface ViewKnowledge
{
void doSomething();
}
class ViewA implements ViewKnowledge {}
ViewA viewA = new ViewA();
ViewB viewB = new ViewB();
viewB.setViewKnowledge(viewA);
Beschreib' ggf. mal genauer, wie dieses "wissen" aussehen soll (was genau sollen sie voneinander kennen?). Sofern das nicht über eine Eigenschaft des Modells passiert, würde es vermutlich vom Controller geregelt werden. Eventuell (!!!) wird dieses Wissen schon über eines der Modelle im GUI abgebildet (z.B. über ein ListModel oder SelectionModel oder ButtonModel bei Swing) - andernfalls könnte (!) man dieses "Wissen" dann wieder über ein Interface rausfaktorisieren, plakativ gesagt sowas wie
Aber das ist so nur ein verschwommenes Bild in der Kristallkugel.Code:interface ViewKnowledge { void doSomething(); } class ViewA implements ViewKnowledge {} ViewA viewA = new ViewA(); ViewB viewB = new ViewB(); viewB.setViewKnowledge(viewA);
Wäre deine Lösung dann die beste?
Das weiß ich nicht, und wer meint, das beurteilen zu können (bzw. zu wissen glaubt) möge sich bitte bei mir melden.
Bisher klingt es schon, als wäre es genug Abstraktion, wenn man dort ein "Window" übergibt, sofern man das Platzieren des einen (oder mehrerer???) Fenster nicht von einer eigenen Klasse übernehmen lassen wollte, die quasi ein "LayoutManager für Fenster" ist. Letzteres klingt IMHO allgemeiner und besser, aber ist auch nur geraten, solange du nicht genauer sagst, was du vorhast.
Ich habe mich jetzt sehr viel mit MVC beschäftigt und es gibt für Client basierte Anwendungen leider kein Kochrezept.
Soll jedoch eine Webanwendung mit Servlets programmiert gibt es genug gute und erforlgreiche MVC Konzepte. + HMVC für Module.
Persönlich finde ich es nicht schlimm, das jede GUI jede kennt. Das ist nach MVC erlaubt und sollte von Situation zu Situation selbst entschieden werden. Sicher braucht kein Login Fenster von einem Spiel Fenster oder Anderem Fenster wissen.
Interessanter ist das Handling der Controller und das Zusammenspiel mit anderen Patterns. (Observer)
Eine gute Anwendung in MVC ermöglicht die komplette GUI auszutauschen und das geht nur wenn man die Controller Logik kapselt und das in Listener. Diese kann man ohne Probleme einer anderen GUI hinzufügen. Ob die Views sich nun kennen oder nicht, hat mit MVC nichts zu tun, sondern mit der internen Semantik, ob das nach Ansicht des Betrachters Sinnvoll ist.
Siehe den anderen Beiträgen.
grüße spin
In Java gibt es keine Mehrfachvererbung. Wenn Deine Klasse von AbstractView erben soll, könnte man ein JPanel als Instanzvariable, müsste aber entsprechende Methoden bereitstellen, damit man von aussen an das Panel kommt. Flexibler wäre man da mit einem ViewInterface.Ich habe ein Fenster, was den JPanel erweitert. Jetzt sind aber alle meine Views Erweiterungen von einer Klasse, die AbstractView heißt. Wie kann ich dafür sorgen, dass mein erweiterter Jpanel trotzdem von AbstractView erbt?
Meine zweite Frage wäre, ob du das mvc-Beispiel von der oraclehomepage kennst:
Java SE Application Design With MVC
und ob du weißt, ob das Observerpattern hier implementiert ist.
In Java gibt es keine Mehrfachvererbung. Wenn Deine Klasse von AbstractView erben soll, könnte man ein JPanel als Instanzvariable, müsste aber entsprechende Methoden bereitstellen, damit man von aussen an das Panel kommt. Flexibler wäre man da mit einem ViewInterface.
Das Oracle Beispiel verwendet hier PropertyChangeListener als Nachrichtenschnittstelle zwischen den Komponenten. Was m.M. sehr abstrakt ist und für den Einstieg in MVC eventuell zu komplex. Ich würde hier eigene ListenerInterfaces verwenden, die etwas konkreter sind.
Noch ein Hinweis: View entspricht nicht unbedingt GUI.
public class MyView extends AbstractView {
}
public class AbstractView extends JPanel {
}
Hallo,
grüße spin