MVC Verständisfragen

Status
Nicht offen für weitere Antworten.

Stillmatic

Mitglied
Hallo!

Ich habe ein par Verständisfragen zum Thema Model View Controller.

1) Im View wird die Grafische Oberfläche implementiert, also zum Beispiel ein Frame!
2) Im Model werden die Daten gespeichert, also zum Beispiel die Werte der Komponenten auf dem Frame!
3) Im Controller werden die Funktionen implementiert, die das zusammenspiel von View und Model steuern! Also zum Beispiel die Actions der Buttons!

Ist das soweit richtig?

Wie genau funktioniert das zusammenspiel!

Ich finde leider kein einfaches Bespiel im Internet, an das ich mich in meinem jetzigen Projekt halten kann!
 

Michael...

Top Contributor
Hallo!

Ich habe ein par Verständisfragen zum Thema Model View Controller.

1) Im View wird die Grafische Oberfläche implementiert, also zum Beispiel ein Frame!
2) Im Model werden die Daten gespeichert, also zum Beispiel die Werte der Komponenten auf dem Frame!
3) Im Controller werden die Funktionen implementiert, die das zusammenspiel von View und Model steuern! Also zum Beispiel die Actions der Buttons!

Ist das soweit richtig?

Wie genau funktioniert das zusammenspiel!

Ich finde leider kein einfaches Bespiel im Internet, an das ich mich in meinem jetzigen Projekt halten kann!
Ergänzend zu 3) würde ich noch sagen View und Model können auch direkt mit einander agieren. z.B. erfolgt die Rückmeldung einer Änderung im Model direkt an die View ohne über den Controller zu gehen

Prinzipiell kann man das Konzept wie folgt zusammenfassen:

Der Controller besitzt eine Instanz von Model
Der Controller besitzt eine Instanz von View
Der Controller weist die Modelinstanz der Viewinstanz zu
Der Controller registiert sich als Beobachter/Listener an der Viewinstanz
Die Viewinstanz registiert sich als Beobachter/Listener an der Modelinstanz
 

Stillmatic

Mitglied
Aber welche Teile eines Programmes müssen dann in welche Klassen damit es konform ist!
Nehmen wir eine einfache Ein/Ausgabe, mit zwei Textfelder und einem Button!
Der Text aus dem Textfeld1 wird beim klicken auf den Button zusätzlich in das Textfeld 2 kopiert!
Ich weiß das dieses Beispiel warscheinlich schlecht gewählt ist, aber mir fällt gerade keien besseres ein!

Das Formular ansich, wäre dann im View!
Doch was kommt in das Model und den Controller?

THX
 

satou

Mitglied
Sagen wir mal du hast 'nen Table und ein 2 Buttons wo du Aktionen ausführen kannst, die eine wäre hinzufügen und die andere löschen und das ganze ist mit einer DB verbunden.

Jetzt hast du einen Frame und ein Panel bzw mehrere Panels, mit Buttons und anderem Kram, die auf dem Frame liegen, das wäre die View. Wenn du jetzt vor hast einen Datensatz hinzuzufügen wäre das eine Aktion ( ActionListener ) die sich nicht in der Klasse des Frame/Panels/Dialog etc befinden sollte um den Überblick zu behalten, das wäre dann der Controller. Das Model sind so Sachen wie DTOs ( Data Transfer Objects ) die dir dabei behilflich sind Daten in die DB zu schreiben bzw zu holen.


Wenn ich etwas falsch erklärt habe dann verbessert mich, ist schon 'ne weile her und ich halte mich auch nicht wirklich dran ^^,
 

Michael...

Top Contributor
Es ist nicht immer sinnvoll das MVC vollständig zu implementieren.
Hier mal ein kurzes Bsp. das jetzt "künstlich" in die Teile Model, View, Controller zerlegt wurde. Um die View zu "beobachten" verwende ich einen ActionListener. Zum "Beobachten" des Models durch die View verwende ich ein selbst definiertes Interface "ModelObserver" (Zeile 116).
Normalerweise würde ich hier View und Controller zusammenlegen, aber vielleicht trägt's zum Verständnis des Konzepts bei.

Java:
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;

import javax.swing.*;

public class MVCDemo2 {
	
	public static void main(String[] args) {
		new MVCDemo2().new Controller().createWindow();
	}

	class Controller implements ActionListener {
		private Model model;
		private View view;

		public Controller() {
			model = new Model();	//neues Model wird erzeugt
			view = new View(model);	//neue View wird erzeugt und erhält gleichzeitig das Model
			view.addListener(this); //Registrierung des Controllers als Beobachter der View
		}
		
		public void createWindow() {
			JFrame frame = new JFrame();
			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			frame.setBounds(0, 0, 500, 300);
			frame.setLocationRelativeTo(null);
			frame.getContentPane().add(view);
			frame.setVisible(true);
		}

		public void actionPerformed(ActionEvent evt) { // Implementierung der Listener Methode
			if (evt.getActionCommand().equals("action1"))
				model.setValueAt(1, model.getValueAt(0));
			else if (evt.getActionCommand().equals("action2"))
				model.setValueAt(0, model.getValueAt(1));
		}
	}

	class View extends JPanel implements ModelObserver {
		private Model model;
		private JButton button1, button2;
		private JTextField field1, field2;
		private JLabel label;

		public View(Model model) {
			this.setLayout(new GridLayout(5, 1, 10, 10));
			this.model = model;
			this.model.addObserver(this); // Registrierung der View als Beobachter des Models
			
			this.add(field1 = new JTextField(model.getValueAt(0)));
			this.add(button1 = new JButton("Copy 1 To 2"));
			this.add(field2 = new JTextField(model.getValueAt(1)));
			this.add(button2 = new JButton("Copy 2 To 1"));
			this.add(label = new JLabel("", JLabel.RIGHT));
			
			button1.setActionCommand("action1");
			button2.setActionCommand("action2");
		}

		public void modelChanged(int index) { // Implementierung der Observer Methode
			label.setText("Feld " + (index+1) + " wurde geändert   ");
			switch (index) {
			case 0:
				field1.setText(field2.getText());
				break;
			case 1:
				field2.setText(field1.getText());
				break;
			}
		}

		public void addListener(ActionListener listener) {
			button1.addActionListener(listener);
			button2.addActionListener(listener);
		}
	}

	class Model {
		private ArrayList<ModelObserver> observerList;
		private String[] value;

		public Model() {
			observerList = new ArrayList<ModelObserver>();
			value = new String[] { "Wert1", "Wert2" };
		}

		public void addObserver(ModelObserver observer) {
			this.observerList.add(observer);
		}

		public String getValueAt(int index) {
			if (index >= this.value.length)
				throw new IllegalArgumentException("Invalid index: " + index
						+ " --> max index: " + this.value.length);
			return value[index];
		}

		public void setValueAt(int index, String value) {
			if (index >= this.value.length)
				throw new IllegalArgumentException("Invalid index: " + index
						+ " --> max index: " + this.value.length);
			this.value[index] = value;
			this.fireModelChanged(index);
		}

		private void fireModelChanged(int index) {
			for (int i = 0; i < observerList.size(); i++)
				observerList.get(i).modelChanged(index);
		}
	}
	/**
	 * Observer Interface, welches jede Klasse, die über Änderungen des Models informiert
	 * werden will implementieren muss
	 */
	interface ModelObserver {
		public void modelChanged(int index);
	}
}
 

satou

Mitglied
Fänd's nicht verkehrt wenn MVC eventuell mit in die FAQ kommt. Ist mitunter einer der meist gestellten Fragen und soweit ich reingeschaut hab war nichts der gleichen vorhanden
 

Heady86

Bekanntes Mitglied
Hi,

Der Controller besitzt eine Instanz von Model
Der Controller besitzt eine Instanz von View
Der Controller weist die Modelinstanz der Viewinstanz zu
Der Controller registiert sich als Beobachter/Listener an der Viewinstanz
Die Viewinstanz registiert sich als Beobachter/Listener an der Modelinstanz

hast du so eine Auflistung zufällig auch für das MVP Muster abrufbereit? ;)

Was ich weiß ist, dass Modell und View voneinander abgegrenzt sind und über den Presenter verbunden werden.
Gibt wohl einige Erklärung dazu aber so eine hübsche Übersicht wie deine für das MVC wäre klasse :rtfm:

Grüße
 

Michael...

Top Contributor
hast du so eine Auflistung zufällig auch für das MVP Muster abrufbereit? ;)

Was ich weiß ist, dass Modell und View voneinander abgegrenzt sind und über den Presenter verbunden werden.
Nein, bin aber auch nicht so von dem Konzept überzeugt und habe mich daher wenig damit auseinandergesetzt.
Wie Du schon geschrieben hast kennen sich beim MVP Model und View nicht und die Kommunikation läuft immer über den Presenter, d.h. letzterer ist sowohl Beobachter von View also auch von Model.
Aber wie gesagt, habe ich mich nur wenig damit beschäftigt.
 

Stillmatic

Mitglied
Hat man dann nicht viele viel Methoden doppelt??
Im VIEW ein setTextAreaText und im MODEL setText!

Wobei der Controller das Model setzt und Das View sich die Daten aus dem Model holt!
 
Status
Nicht offen für weitere Antworten.

Oben