Aloha und noch einmal des Verständnis halber, wäre es klasse wenn ihr mir sagen könntet ob ich dieses Pattern nun endlich richtig verstanden habe
, hierzu halte ich mein Beispiel so einfach wie möglich !
Bespiel
Konkretes Problem :
-Farbwechsel eines in einem Frame enthaltenen Panels über einen Button, ggf. späteres hinzufügen von weiterer Funktionalität bzw. Austausch der Komponenten
Lösungsansatz nach MVC Pattern ohne Observer! :
Model :
Das Model liefert ausschließlich die Daten , bzw. die Funktionalität, das Model kennt weder die View , noch den Controller ( außer bei implementiertem Observer Pattern), und ist somit komplett austauschbar.
View :
Die View dient nur als Schnittstelle zur Sicht auf die Daten, stellt Methoden bereit um listener hinzuzufügen und bietet getter an welche eine Referenz auf benötigte Komponenten liefert.
Die View kennt weder Controller noch das Model, und ist wie auch das Model austauschbar
Der Controller :
Der Controller Initialisiert die View, und hält Referenzen auf das Model und die View, er dient zur Kommunikation und Steuerung zwischen den einzelnen Elementen, er bereitet die Daten auf und führt dementsprechend Aktionen aus dem Model aus welche in der View abgerufen/angefordert werden, der Kontroller hält Referenzen auf Model und View, ist aber trozdem mit etwas mehraufwand auch austauschbar.
TestMvc :
Instanziert nur einen neuen Controller mit entsprechendem Model
Nun 3 Fragen :
1. Sind meine Annahmen korrekt ?
2. Wenn ich jetzt anstelle von Listenern , z.B in einer JMenuBar oder JToolbar, Actions verwende, welche sich zur Steuerrung der Verarbeitung kümmern, dann sind diese doch die Controller , oder täusche ich mich ?
3. Wenn ich nun dazu übergehe das Observer-Pattern zu implementieren, dann muss ich es ermöglichen das sich interessenten ja bei den zu beobachtenden Komponenten an und abmelden können, z.B das sich die View , als beobachter beim Controller registrieren kann , oder der Controller beim Model,
Wie würde ich , bzw. wie würdet ihr dies auf das oben genannte Beispiel umsetzen , und wie sehe die implementierund dazu aus ?
Vielen Dank vorab
Wäre super wenn sich dann nochmal jemand anschauen könnte und mir möglichst fachliche rückmeldung geben würde.
Bespiel
Konkretes Problem :
-Farbwechsel eines in einem Frame enthaltenen Panels über einen Button, ggf. späteres hinzufügen von weiterer Funktionalität bzw. Austausch der Komponenten
Lösungsansatz nach MVC Pattern ohne Observer! :
Model :
Java:
public class Model {
JComponent component;
Color color;
public Model() {}
public void changeColor(JComponent component, Color color){
component.setBackground(color);
}
}
Das Model liefert ausschließlich die Daten , bzw. die Funktionalität, das Model kennt weder die View , noch den Controller ( außer bei implementiertem Observer Pattern), und ist somit komplett austauschbar.
View :
Java:
public class View {
private JFrame frame;
private JPanel panel;
private JButton btn;
public View() {
frame = new JFrame("MVC Test");
frame.setSize(300,150);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
panel = new JPanel(new BorderLayout());
btn = new JButton("Farbe wechseln");
panel.add(BorderLayout.PAGE_END, btn);
frame.add(BorderLayout.CENTER, panel);
}
public void addListener(ActionListener listener){
btn.addActionListener(listener);
}
public void setVisible(){
frame.setVisible(true);
}
public JPanel getPanel() {return this.panel;}
}
Die View dient nur als Schnittstelle zur Sicht auf die Daten, stellt Methoden bereit um listener hinzuzufügen und bietet getter an welche eine Referenz auf benötigte Komponenten liefert.
Die View kennt weder Controller noch das Model, und ist wie auch das Model austauschbar
Der Controller :
Java:
public class Controller implements ActionListener{
View view;
Model model;
public Controller(Model model) {
this.view = new View();
this.model = model;
view.addListener(this);
view.setVisible();
}
@Override
public void actionPerformed(ActionEvent e) {
model.changeColor(view.getPanel(), Color.BLUE);
}
}
Der Controller Initialisiert die View, und hält Referenzen auf das Model und die View, er dient zur Kommunikation und Steuerung zwischen den einzelnen Elementen, er bereitet die Daten auf und führt dementsprechend Aktionen aus dem Model aus welche in der View abgerufen/angefordert werden, der Kontroller hält Referenzen auf Model und View, ist aber trozdem mit etwas mehraufwand auch austauschbar.
TestMvc :
Java:
public class TestMvc {
public static void main(String[] args) {
new Controller(new Model());
}
}
Instanziert nur einen neuen Controller mit entsprechendem Model
Nun 3 Fragen :
1. Sind meine Annahmen korrekt ?
2. Wenn ich jetzt anstelle von Listenern , z.B in einer JMenuBar oder JToolbar, Actions verwende, welche sich zur Steuerrung der Verarbeitung kümmern, dann sind diese doch die Controller , oder täusche ich mich ?
3. Wenn ich nun dazu übergehe das Observer-Pattern zu implementieren, dann muss ich es ermöglichen das sich interessenten ja bei den zu beobachtenden Komponenten an und abmelden können, z.B das sich die View , als beobachter beim Controller registrieren kann , oder der Controller beim Model,
Wie würde ich , bzw. wie würdet ihr dies auf das oben genannte Beispiel umsetzen , und wie sehe die implementierund dazu aus ?
Vielen Dank vorab
Wäre super wenn sich dann nochmal jemand anschauen könnte und mir möglichst fachliche rückmeldung geben würde.