OOP Model View Controller - Prinzip

chuvak

Aktives Mitglied
Ich bin dabei, eine einfache Anwendung nach dem Model-View-Controller-Prinzip zu erstellen.

Es soll einen "Ticket-Automaten" darstellen, wo man Tickets für Kinder und Erwachsene kaufen kann.

Controller: Es gibt je einen Button, mit der man die Tickets pro Altersgruppe bestellen kann. Deren Anzahl wird in Textfeldern angezeigt.
View: 2 Instanzen vom Controller + eigene Steuerelemente (nochmal die Daten aus den Controllern und die Gesamtanzahl der Tickets (Summe der beiden Controller).

Da die Controller unabhängig voneinander funktionieren (sie kennen sich nicht), müssen deren Inhalte irgendwo an einer zentralen Stelle gespeichert werden (Model?).

Jetzt weiß ich leider nicht, wie ich das realisieren soll. Ich denke, die Modelklasse muss eine Beobachterrolle einnehmen und soll die Ergebnisse speichern, wenn bei einem der Controller ein Button gedrückt wird. Die beiden Instanzen der Controller muss sie auch irgendwie unterscheiden können.

Kann mir bitte jemand helfen?
 

Anhänge

Von meiner Perpektive aus sollte der Controller keine GUI elemente enthalten.

Sondern jedes GUI Element hat für das Handling der EVents eine Refenrez auf einen Controller der die Aktion verarbeitet. Der Controller selber operiert dann auf dem Datenmodel.


Dösiges Beispiel an dem sich viel kritisieren ließe - aber es verdeutlicht das Prinzip:

Java:
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class JFrameTest extends JFrame{

	public JFrameTest(){
		// add some values to the data model:
		final DataModel model = new DataModel();
		final ClickController addController = new AddController(model);
		final ClickController delController = new DelController(model);
		final JPanel panel = new JPanel();
		
		final JButton addButton = new JButton("Add value");
		panel.add(addButton);
		addButton.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				addController.handleEvent("blabliblu");
			}
		});
		
		final JButton delButton = new JButton("Delete value");
		panel.add(delButton);
		delButton.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				delController.handleEvent("blabliblu");
			}
		});
		
		this.add(panel);
		this.pack();
	}
	
	public static void main(String[] args) {
		JFrameTest a = new JFrameTest();
		a.setSize(new Dimension(100,100));
		a.setVisible(true);
	}
	
	static interface ClickController{
		void handleEvent(String s);
	}
	static class AddController implements ClickController{

		private DataModel model;
		
		public AddController(DataModel model){
			this.model = model;
		}
		@Override
		public void handleEvent(String s) {
			model.addString(s);
			
		}
		
	}
	
	static class DelController implements ClickController{
		private DataModel model;
		
		public DelController(DataModel model){
			this.model = model;
		}

		@Override
		public void handleEvent(String s) {
			model.delString(s);
			
		}
		
	}
	
		
	static class DataModel {

		private List<String> values;

		public DataModel(){
			values = new ArrayList<String>();
		}
		
		public void addString(String s){
			System.out.println("Adding "+s);
			values.add(s);
		}
		
		public void delString(String s){
			System.out.println("Removing "+s);
			values.remove(s);
		}
	}
	}
}
 
Zuletzt bearbeitet von einem Moderator:
Controller: Es gibt je einen Button, mit der man die Tickets pro Altersgruppe bestellen kann. Deren Anzahl wird in Textfeldern angezeigt.
View: 2 Instanzen vom Controller + eigene Steuerelemente (nochmal die Daten aus den Controllern und die Gesamtanzahl der Tickets (Summe der beiden Controller).
Das entspricht jetzt nicht unbedingt dem MVC. Bei diesem Entwurfsmuster spielt der Controller eine zentrale Rolle. Mag sein, dass es Fälle gibt in denen man mit mehreren Controllern arbeitet (macht in Deinem Fall aber keinen Sinn), diese werden dann aber wieder durch einen Controller verwaltet. Aber generell gilt eine View wird durch einen Controller verwaltet. Ein Controller kann aber eine oder mehrere Views verwalten (1:n Beziehung)
Ich denke, die Modelklasse muss eine Beobachterrolle einnehmen
Beim MVC Pattern wird das Modell beobachtet. In Kürze:
Controller besitzt eine Referenz auf View und Model und "beobachtet" die View
View besitzt eine Referenz auf das Model und "beobachtet" dieses
Model besitzt weder eine direkte Referenz auf View oder Controller, es kennt die View nur als "Beobachter" (falls notwendig kann man auch noch den Controller als "Beobachter" an der View registrieren)
 
Beim MVC Pattern wird das Modell beobachtet. In Kürze:
Controller besitzt eine Referenz auf View und Model und "beobachtet" die View
View besitzt eine Referenz auf das Model und "beobachtet" dieses
Model besitzt weder eine direkte Referenz auf View oder Controller, es kennt die View nur als "Beobachter" (falls notwendig kann man auch noch den Controller als "Beobachter" an der View registrieren)

Genau, an Referenzen habe ich auch gedacht. Könntest du evtl. ein Beispiel nennen, wie man die Referenzen herstellt, bzw Klassen registriert?
 
Genau, an Referenzen habe ich auch gedacht. Könntest du evtl. ein Beispiel nennen, wie man die Referenzen herstellt, bzw Klassen registriert?
Referenzen erstellt man nicht Referenzen hält man ;-) - in Variablen.
Hier mal ein kurz und knapp Bsp.
PseudoController hält eine Referenz auf den JButton (View) in der Instanzvariablen button und registriert sich gleich als "Beobachter" (Zeile 6)
Java:
class PseudoController implements ActionListener {
	private JButton button;
	
	public PseudoController() {
		button = new JButton("Button");
		button.addActionListener(this);
	}
	
	public void actionPerformed(ActionEvent evt) {
		
	}
}
 

Neue Themen


Zurück
Oben