MVC + Strategy Pattern Ansatz (mit Code)

markus99

Bekanntes Mitglied
Hallo erstmal!
Ich versuche seit einigen Stunden diese 2 Strategy Pattern zu vereinen.
Dabei hab ich allerdings einen Denkfehler, dazu komme ich nach dem Code!

Es gibt 3 Klassen: Modell, Viewer, Controller

In der View wählt man über ein Dropdown-Menü eine Währung aus. Während der Auswahl wird der Wert (als String) nach Controller und Modell übergeben und dort zugeordnet. Nach einem Klick auf "Berechnen" wird der ausgerechnete Wert zurückgeholt.
Vor einigen Momenten habe ich den Code mit einem Textfeld erweitert (noch viel todo).

Was ich auf alle Fälle noch brauche ist ein zweites Dropdown-Menü, womit man mehrere Währungen beliebig umrechnen kann. Doch das möchte ich lieber gleich "richtig" mit dem Strategy Pattern erledigen, wofür ich hier ein wenig Hilfe benötige.

Viewer:
Java:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
 
public class Viewer extends JFrame implements Observer 
{
    private Controller controller;
    private JPanel mainPanel;
    private Choice dropdownmenu;
    private JLabel ergebnis;
    private JTextField eingabemenge;
    private String temp;
 
    public Viewer(Controller controller) 
    {
        super("Viewer");
        this.controller = controller;
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        init();
        setSize(300,300);
        setVisible(true);
        setLayout(null);
    }
 
    private void init() 
    {
        dropdownmenu = new Choice();
        dropdownmenu.addItem("Dollar");
        dropdownmenu.addItem("Yen");
        
        mainPanel = new JPanel();
        mainPanel.setLayout(null);
        ergebnis = new JLabel();

        dropdownmenu.addItemListener(new ItemListener() 
        {
            public void itemStateChanged(ItemEvent e) 
            {
                temp = e.getItem().toString();
            }
        });
        
        JButton btnBerechnen = new JButton("Berechnen");
        btnBerechnen.addActionListener(new ActionListener() 
        {
 
            public void actionPerformed(ActionEvent event) 
            {
                controller.berechnen(temp); 
            }
        });

        eingabemenge = new JTextField("0");
        
        eingabemenge.addKeyListener(new KeyListener() 
        {
        public void keyPressed(KeyEvent e) 
        {
        }
        public void keyReleased(KeyEvent e) 
        {
        }
        public void keyTyped(KeyEvent e) 
        {
            try 
            {
                String a = e.getKeyChar()+"";
                controller.setEingabemenge(a);
                System.out.println(a);
                eingabemenge.setText(a);
                controller.setEingabemenge(a);
            } 
            catch (NumberFormatException ee) 
            {
                System.out.println("Eingabe ist keine Zahl");
            }
            eingabemenge.setText("");
            }
        });
        
        mainPanel.add(eingabemenge);
        mainPanel.add(dropdownmenu);
        mainPanel.add(ergebnis);
        mainPanel.add(btnBerechnen);
        
        eingabemenge.setBounds(20,20,70,25);
        dropdownmenu.setBounds(110,20,70,25);
        ergebnis.setBounds(110,60,70,25);
        btnBerechnen.setBounds(70,100,150,25);
        
        getContentPane().add(mainPanel);
    }
 
    public void update(Observable arg0, Object arg1) 
    {
        Modell modell = (Modell) arg1;
        ergebnis.setText(String.valueOf(modell.getBerechnen()));
    }
}

Controller:
Java:
import javax.swing.*;

public class Controller 
{
    private Modell modell;
 
    public Controller() 
    {
        Viewer viewer = new Viewer(this);
        modell = new Modell();
        modell.addObserver(viewer);
    }

    public void berechnen(String Waehrung) 
    {
        modell.doBerechnen(Waehrung);
    }
    
    public void setEingabemenge(String inc)
    {
        modell.doEingabeMenge(inc);
    }

    public static void main(final String[] args) 
    {
        Runnable gui = new Runnable() 
        {
            @Override
            public void run() 
            {
                new Controller();
            }
        };
        SwingUtilities.invokeLater(gui);
    }
}

Modell:
Java:
 import java.util.*;
 
public class Modell extends Observable 
{
 
    private double berechnen = 1.0;
    private String Waehrung;
    private double toDouble;
    
    public double getBerechnen() 
    {
        return berechnen;
    }
    
    
    public void doBerechnen(String incoming) 
    {
        Waehrung = incoming;
        double dollarkurs = 1.2826;
        double yenkurs = 103.1360;
        if(Waehrung.equals("Dollar"))
        {
            this.berechnen = toDouble*dollarkurs;
        }
        else if(Waehrung.equals("Yen"))
        {
            this.berechnen = toDouble*yenkurs;
        }
        else
        {
            this.berechnen = 99; //
        }
        setChanged();
        notifyObservers(this);
    }
    
    public void doEingabeMenge(String inc)
    {  
        if(inc.matches("[0-9]")) //todo
        {
            toDouble = Double.parseDouble(inc);
        }
        else
        {
            System.out.println("Keine Zahl eingegeben");
        }
    }
}

Da ich nun das Strategy Pattern in bezug auf (Achtung!) mehrere Umrechnungsmöglichkeiten (Euro->Dollar, Dollar->Euro, ...) einbauen muss, dachte ich an ein weiteres Interface.
Also ein Interface "Umrechner" welches ich an die Modell hänge.
Am Interface habe ich dann weitere Klassen, wie etwa EurToDoll oder DolltoEur.
Nun ist mir allerdings unklar wie ich diese Klassen aufrufen soll ohne das Strategy Konzept zu verwerfen. Wenn ich mir in der Modell-Klasse eine Überprüfung der Strings erkalube (wie oben im Code), dann wäre das Strategy Pattern doch keines mehr, oder?

Wie soll ich dann prüfen welches Element in der Dropdown-Liste (Choice) ich an welche Strategy-Umrechnungsklasse übergeben muss?

Geplant wäre es ja so:
Eingabe(Viewer) -> Übergabe(Controller) -> Bearbeitung/Weiterreichen(Modell) -> StrategyPattern(Eur->Doll (...) + return) -> Prüfung(Modell) -> Weitergabe(View)

Mein erster Versuch mit Design Pattern, wäre super wenn mir etwas Hilfe entgegen kommt!
 

Michael...

Top Contributor
Für einen Währungsrechner ist es unnötig für jede Umrechnungsart ein eigenes Objekt zu implementieren oder gar eine eigene Klasse zu definieren. Zumal die Anzahl mit zunehmender Anzahl an Währungen ja exponentiell zunimmt.
Hierfür ist es doch nur notwendig den Wert einer Währung zu einer Referenzwährung (z.B. Euro) zuspeichern, die Umrechnung erfolgt dann immer für jede Währung nachn dem selben Prinzip Währung1 -> EUR -> Währung2.
 

markus99

Bekanntes Mitglied
Das wäre nur logisch, mein Professor hat mir allerdings ein Klassendiagramm mit einzelnen Umrechnungs-Klassen nach dem Strategy-Prinzip vorgegeben.

Ich verwende hierfür nur 3 Währungen, also insgesamt 3²-3 Klassen.
Eur>Dol
Dol>Eur
Eur>Yen
Yen>Eur
Dol>Yen
Yen>Dol

Diese binde ich über ein Interface ein, gemeinsame Methode wird einfach nur "Umrechnen".
Nur wie kann ich diese mit nur einem(bald 2, aus den Dropdown Menüs) übergebenen String-Objekt "zeigen"?

Es wäre fein wenn ich den Aufruf der "Umrechnen" Methode im Interface mitsamt Parametern mit den 2 mitgegebenen Strings lösen könnte. Geht das oder habe ich einen Denkfehler?
In etwa so: Umrechnen(String a, String b); // a = dropdownauswahl1, b = dropdownauswahl2
Das soll dann über die Klasse aZub laufen.
Also in etwa eine durch Strings zusammengesetzter Methodenaufruf, wobei ich nicht glaube dass das funktioniert. Und genau das ist mein Problem, hier habe ich einen schweren Denkfehler.
 

Michael...

Top Contributor
Es wäre fein wenn ich den Aufruf der "Umrechnen" Methode im Interface mitsamt Parametern mit den 2 mitgegebenen Strings lösen könnte. Geht das oder habe ich einen Denkfehler?
In etwa so: Umrechnen(String a, String b); // a = dropdownauswahl1, b = dropdownauswahl2
Das ginge nur bei einer Berechnung aller Währungen in einer Implementierung. Wenn die jeweilige Berechung aber in einerm eigenen Strategy Objekt implementiert ist, dann muss man die Berechnung auch an dem passenden Objekt aufrufen. Das heißt der Währungsrechner müsste wissen welche Strategie er anwenden muss -> Fallunterscheidung für die n^2 Umrechnungsfälle. Die Komplexität könnte man noch etwas entschärfen, in dem man die Strategy Objekte in einer Map verwaltet, Schlüssel könnte z.B. die Kombination der Indices oder der Werte der beiden Combos sein.
 

markus99

Bekanntes Mitglied
Gibt es hierfür exemplarischen Code?
Ohne diese Zusammensetzung wäre es ja kein MVC/Strategy mehr, denke ich zumindest.
Auch das Befüllen der Dropdown-List sollte ich wohl noch über die Modell realisieren.

Bitte weiterhin um Ansätze für einen Wissenshungrigen Beginner :)
 

Michael...

Top Contributor
Das Model kann ja per Methode eine (String-)Liste mit den möglichen Währungen anbieten. Genauso eine Methode umrechnen(String A, String B). In dieser Methode muss dann anhand der Strings die passende Strategie ermittelt werden, z.B. per Fallunterscheidung, Map...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Strategy Pattern - Rechner Java Basics - Anfänger-Themen 6
H Verständnis Strategy Pattern Java Basics - Anfänger-Themen 4
E JFrame + Buffer-strategy Java Basics - Anfänger-Themen 8
J Strategy: geht es immer um die Algorithmen? Java Basics - Anfänger-Themen 4
B Was ist der unterschied zwischen Singleton und Strategy? Java Basics - Anfänger-Themen 6
D was ist der vorteil vom Builder-design pattern? Java Basics - Anfänger-Themen 11
W GoF-Pattern im Programmierer-Alltag Java Basics - Anfänger-Themen 113
D Java Pattern mit X Ausgabe Stern Java Basics - Anfänger-Themen 4
J Methoden Observer-Pattern mit Consumer und accept( ) Java Basics - Anfänger-Themen 6
Dimax Erste Schritte Pattern.matcher,die Besonderheiten. Java Basics - Anfänger-Themen 12
N Best Practice Frage zum MVC-Pattern Java Basics - Anfänger-Themen 2
J Implementierung von Observer und Singleton-Pattern Java Basics - Anfänger-Themen 9
F Design pattern Java Basics - Anfänger-Themen 29
W RegEx Matcher + Pattern und Emails Java Basics - Anfänger-Themen 8
M Schlüsselworte Unterschied: String.matches und Pattern.compile Java Basics - Anfänger-Themen 2
C Best Practice JTable in MVC Pattern Java Basics - Anfänger-Themen 7
D Design Pattern Command Java Basics - Anfänger-Themen 3
Bregedur Methoden Matcher und Pattern bei sich wiederholenden Werten Java Basics - Anfänger-Themen 1
fLooojava MVC Pattern und Observer Pattern Java Basics - Anfänger-Themen 6
S Regex Pattern Java Basics - Anfänger-Themen 3
Z Pattern und Matcher substring zu String möglich? Java Basics - Anfänger-Themen 4
B Pattern für Email Liste Java Basics - Anfänger-Themen 3
J Builder Pattern implementieren Java Basics - Anfänger-Themen 3
Tarrew Proxy Design-Pattern Java Basics - Anfänger-Themen 1
M Methoden Pattern Matching Vokal Java Basics - Anfänger-Themen 2
agent47 Pattern split Java Basics - Anfänger-Themen 2
J MVC Pattern, mehrere Controller/Views/Models Java Basics - Anfänger-Themen 0
I Vertändnisfrage zu Prototype Pattern Java Basics - Anfänger-Themen 0
L Kompositum-Pattern Hilfe :O Java Basics - Anfänger-Themen 4
F eigenes Listener Pattern mit Interface Java Basics - Anfänger-Themen 1
S Je nach erhaltene Daten unterschiedlich reagieren (Design Pattern?) Java Basics - Anfänger-Themen 3
B Pattern Matching ohne Match-Methoden Java Basics - Anfänger-Themen 11
Furtano OOP Memento Pattern | übergabe einer Kopie des Arrays Java Basics - Anfänger-Themen 0
F Erste Schritte Pattern zum Zerlegen von selbstdefinierten Dateinamen Java Basics - Anfänger-Themen 7
A Design Pattern - Welche? Java Basics - Anfänger-Themen 33
Rudolf OOP Übungen zu Design Pattern in Java Java Basics - Anfänger-Themen 6
A Observer Pattern Problem Java Basics - Anfänger-Themen 15
J Interface Frage zu Interfces am Beispiel Observer Pattern Java Basics - Anfänger-Themen 8
S OOP Regex Pattern Java Basics - Anfänger-Themen 2
P Grundsatzfrage zu Decorator-Pattern Java Basics - Anfänger-Themen 6
L Pattern Matching Java Basics - Anfänger-Themen 3
L RegExp bzw Pattern in Java Java Basics - Anfänger-Themen 6
Helgon Observer Pattern - hasChanged() immer false Java Basics - Anfänger-Themen 10
R aktualisierung des View im MVC-Pattern Java Basics - Anfänger-Themen 5
M RegEx Pattern Matcher Java Basics - Anfänger-Themen 16
R Pattern bzw. Regex HTML-Code Java Basics - Anfänger-Themen 10
N Regexp Pattern & Matcher Problem Java Basics - Anfänger-Themen 4
I OOP Verständnisfrage zu Singelton Pattern Java Basics - Anfänger-Themen 21
R Welches Design pattern Java Basics - Anfänger-Themen 10
B static und Pattern matching Java Basics - Anfänger-Themen 22
T pattern klappt nicht so Java Basics - Anfänger-Themen 6
T Decorator Pattern Java Basics - Anfänger-Themen 7
A Pattern und Matcher Java Basics - Anfänger-Themen 9
T Frage zu Pattern/Matcher Java Basics - Anfänger-Themen 6
D Pattern in Midi-Sequencer Java Basics - Anfänger-Themen 2
V Frage zu Decorator-Pattern Java Basics - Anfänger-Themen 4
S OOP Factory Pattern Java Basics - Anfänger-Themen 2
C OOP Observer Pattern Java Basics - Anfänger-Themen 2
M Regex-Pattern Java Basics - Anfänger-Themen 2
Haubitze_Broese Pattern für Links in RSS-Reader Java Basics - Anfänger-Themen 6
Raidri Pattern liefert false Java Basics - Anfänger-Themen 9
megachucky regex-Problem ( mit den Klassen Matcher / Pattern) --> XML prüfen Java Basics - Anfänger-Themen 11
O useDelimiter / Muster im Parameter (Pattern) Java Basics - Anfänger-Themen 6
S Problem mit Pattern Java Basics - Anfänger-Themen 2
S Pattern.matches mit Ignore Case Java Basics - Anfänger-Themen 2
N in int array einen pattern(eine zahl) finden Java Basics - Anfänger-Themen 21
A Hilfe zu Pattern Java Basics - Anfänger-Themen 2
Y Pattern Java Basics - Anfänger-Themen 2
A Proxy Pattern implementieren Java Basics - Anfänger-Themen 2
N OOP MVC Pattern Java Basics - Anfänger-Themen 3
G Probleme mit Pattern und Aussagenlogik Java Basics - Anfänger-Themen 6
D regexp-pattern .. letzter schliff Java Basics - Anfänger-Themen 6
A ist das ein Singleton-Pattern? Java Basics - Anfänger-Themen 6
Z regexp/pattern für dateipfad Java Basics - Anfänger-Themen 5
A Factory Pattern Java Basics - Anfänger-Themen 2
D Objekte anlegen und Singleton Pattern Java Basics - Anfänger-Themen 21
O Erklärung für Pattern Java Basics - Anfänger-Themen 5
U Java Pattern Regex Java Basics - Anfänger-Themen 9
0 Probleme mit Pattern und Matcher Java Basics - Anfänger-Themen 5
K Observer Pattern notifyObservers Java Basics - Anfänger-Themen 9
S geeignetes Such Pattern Java Basics - Anfänger-Themen 6
J Zugriff mit Visitor Pattern auf eigen erstellte verk. Liste Java Basics - Anfänger-Themen 3
J Visitor Pattern Java Basics - Anfänger-Themen 4
W Observer-Pattern Java Basics - Anfänger-Themen 3
M Singleton Pattern Java Basics - Anfänger-Themen 35
J Singleton Pattern Java Basics - Anfänger-Themen 5
J Ant pattern Erklaerung Java Basics - Anfänger-Themen 4
G Aufbau MVC-Pattern Java Basics - Anfänger-Themen 6
M Pattern Matching Java Basics - Anfänger-Themen 2
S Singleton Pattern passend hierfür? Java Basics - Anfänger-Themen 60
M Factory Pattern Ansatz falsch? Java Basics - Anfänger-Themen 6
Y Hilfe bei Pattern-Regexp Java Basics - Anfänger-Themen 5
U pattern Java Basics - Anfänger-Themen 2
A Pattern.matches(); Java Basics - Anfänger-Themen 14
A Problem mit Obser-Pattern Java Basics - Anfänger-Themen 2
P pattern/match Java Basics - Anfänger-Themen 2
K Probleme mit RegEx (Pattern und Matcher) Java Basics - Anfänger-Themen 2
K Regex Pattern Java Basics - Anfänger-Themen 4
G Vorteile Reflection bezüglich MVC-Pattern Java Basics - Anfänger-Themen 9
F regex pattern problem Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben