Nachfolgend habe ich den FAQ Beitrag MVC mal auf einfache Art angepasst:
MVC - Design
Das MVC Design (Model - View - Controller) beschreibt den Ansatz, den Datenzugriff und die Anwendungslogik von der graphischen Darstellungsart zu trennen. Genauer gesagt können wir MVC in drei Elemente aufteilen:
Model:
Das Model enthält die Daten, sowie die Regeln zum Datenzugriff und deren Aktualisierung.
Es befinden sich keinerlei Informationen in den Klassen, wie ihre Visualisierung aussieht.
View:
Die View stellt den Inhalt eines Models auf der graphischen Benutzeroberfläche dar. Es definiert genau, wie die Modeldaten visualisiert werden sollen. Wenn sich die Modeldaten ändern, muss die View diese Darstellung entsprechend aktualisieren. Dies wird meist dadurch erreicht, dass die View sich beim Model registriert, um über Änderungen informiert zu werden.
In der View befinden sich keine Informationen über die Speicherung bzw. Manipulation der Daten.
Controller:
Der Controller übersetzt die Benutzeraktionen in Aktionen, die das Model ausführen muss. Eine Benutzeraktion kann z.B. ein Buttonklick oder eine Menüauswahl sein.
Folgendes (äußerst simple) Beispiel soll dies demonstrieren:
Die Klasse Wind ist die ModelKlasse. In ihr werden Windrichtung und Windgeschwindigkeit gespeichert.
Die Klasse WindViewer ist die ViewKlasse. Sie dient dazu die Daten der Wind Klasse anzuzeigen und man kann über die Buttons die Daten ändern.
Die Klasse WindController ist die Controller Klasse. Sie übersetzt die Buttonaktionen in Modelaktionen.
MVC - Design
Das MVC Design (Model - View - Controller) beschreibt den Ansatz, den Datenzugriff und die Anwendungslogik von der graphischen Darstellungsart zu trennen. Genauer gesagt können wir MVC in drei Elemente aufteilen:
Model:
Das Model enthält die Daten, sowie die Regeln zum Datenzugriff und deren Aktualisierung.
Es befinden sich keinerlei Informationen in den Klassen, wie ihre Visualisierung aussieht.
View:
Die View stellt den Inhalt eines Models auf der graphischen Benutzeroberfläche dar. Es definiert genau, wie die Modeldaten visualisiert werden sollen. Wenn sich die Modeldaten ändern, muss die View diese Darstellung entsprechend aktualisieren. Dies wird meist dadurch erreicht, dass die View sich beim Model registriert, um über Änderungen informiert zu werden.
In der View befinden sich keine Informationen über die Speicherung bzw. Manipulation der Daten.
Controller:
Der Controller übersetzt die Benutzeraktionen in Aktionen, die das Model ausführen muss. Eine Benutzeraktion kann z.B. ein Buttonklick oder eine Menüauswahl sein.
Folgendes (äußerst simple) Beispiel soll dies demonstrieren:
Die Klasse Wind ist die ModelKlasse. In ihr werden Windrichtung und Windgeschwindigkeit gespeichert.
Die Klasse WindViewer ist die ViewKlasse. Sie dient dazu die Daten der Wind Klasse anzuzeigen und man kann über die Buttons die Daten ändern.
Die Klasse WindController ist die Controller Klasse. Sie übersetzt die Buttonaktionen in Modelaktionen.
Java:
package test.model;
/**
* Model
* @author deathbyaclown/André Uhres
*/
import java.util.*;
public class Wind extends Observable {
private Direction dir = Direction.NORTH;
private int speed = 0;
/**
* @return Returns the dir.
*/
public Direction getDir() {
return dir;
}
/**
* @param dir The dir to set.
*/
public void setDir(Direction dir) {
this.dir = dir;
setChanged();
notifyObservers(this);
}
/**
* @return Returns the speed.
*/
public int getSpeed() {
return speed;
}
/**
* @param speed The speed to set.
*/
public void setSpeed(int speed) {
this.speed = speed;
setChanged();
notifyObservers(this);
}
}
Java:
package test.model;
/**
* @author deathbyaclown
*/
public enum Direction {
NORTH, EAST, SOUTH, WEST
}
Java:
package test.view;
/**
* View
* @author deathbyaclown/André Uhres
*/
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import test.controll.*;
import test.model.*;
public class WindViewer extends JFrame implements Observer {
private WindController controller;
private JLabel direction;
private JLabel speed;
private JPanel buttonPanel;
private JPanel mainPanel;
public WindViewer(WindController controller) {
super("WindViewer");
this.controller = controller;
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
init();
pack();
setLocationRelativeTo(null);
setVisible(true);
}
private void init() {
buttonPanel = new JPanel();
mainPanel = new JPanel();
direction = new JLabel();
speed = new JLabel();
mainPanel.add(new JLabel("Direction: "));
mainPanel.add(direction);
mainPanel.add(new JLabel("Speed: "));
mainPanel.add(speed);
getContentPane().add(mainPanel);
JButton button = new JButton("Change Direction");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
controller.changeDirection();
}
});
buttonPanel.add(button);
button = new JButton("Change Speed");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
controller.changeSpeed();
}
});
buttonPanel.add(button);
getContentPane().add(buttonPanel, BorderLayout.SOUTH);
}
/*
* (non-Javadoc)
*
* @see java.util.Observer#update(java.util.Observable, java.lang.Object)
*/
public void update(Observable arg0, Object arg1) {
Wind wind = (Wind) arg1;
direction.setText(wind.getDir().toString());
speed.setText(String.valueOf(wind.getSpeed()));
}
}
Java:
package test.controll;
/**
* Controller
* @author deathbyaclown/André Uhres
*/
import javax.swing.*;
import test.model.*;
import test.view.*;
public class WindController {
private Wind wind;
public WindController() {
WindViewer viewer = new WindViewer(this);
wind = new Wind();
wind.addObserver(viewer);
}
public void changeDirection() {
Direction[] dir = Direction.values();
wind.setDir(dir[(int) (Math.random() * 4)]);
}
public void changeSpeed() {
wind.setSpeed((int) (Math.random() * 100));
}
public static void main(final String[] args) {
Runnable gui = new Runnable() {
@Override
public void run() {
new WindController();
}
};
//GUI must start on EventDispatchThread:
SwingUtilities.invokeLater(gui);
}
}