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:
Controller:
Modell:
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!
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!