=============================================== **Datei ATMSimulation.java: import atm.*; import konsortium.*; import bank.*; class ATMSimulation { public static void main(String[] args) { Bank b = new Bank(); Konsortium k = new Konsortium(b); ATM atm = new ATM(k); atm.setVisible(true); } } =============================================== **Datei Ibank.java: package interfaces; public interface Ibank { public String bankKarteUeberpruefen(); public String bankTransaktionVerarbeiten(); } =============================================== **Datei Ikonsortium.java: package interfaces; public interface Ikonsortium { public String karteUeberpruefen(); public String transaktionVerarbeiten(); } =============================================== **Datei ATM.java: package atm; import interfaces.Ikonsortium; import java.awt.*; import java.awt.event.*; import javax.swing.*; /* Implementierung der Klasse ATM mit integrierter GUI */ public class ATM extends JFrame implements ActionListener { //ATM-Attribute private double geldvorrat; private double grenzen; private int aktGeheimzahl; private int aktKartennr; //wird in der Simulation nicht verwendet private int aktBLZ; //wird in der Simulation nicht verwendet private int aktKontonr; //wird in der Simulation nicht verwendet //Refernzattribut für Konsortium private Ikonsortium konsortium; //Refernzattribute für GUI private KeyPad pad; private JTextArea display; private JButton bestaetigungsButton; private JButton abbruchButton; private JButton stopButton; //Referenzattribut für Zustandsobjekt private State state; public ATM(Ikonsortium k) { //Konsortium initialisieren konsortium = k; //ATM-Attribute initialisieren geldvorrat = 100000; grenzen = 250; //Konstruktion der GUI setSize(700, 200); setTitle("ATM-Simulation"); pad = new KeyPad(); display = new JTextArea(5, 31); bestaetigungsButton = new JButton("Bestätigen"); abbruchButton = new JButton("Abbruch"); stopButton = new JButton("Beenden"); JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new GridLayout(3, 1)); buttonPanel.add(bestaetigungsButton); buttonPanel.add(abbruchButton); buttonPanel.add(stopButton); Container cont = getContentPane(); cont.setLayout(new FlowLayout()); cont.add(pad); cont.add(display); cont.add(buttonPanel); //ATM als ActionListener zu allen Buttons hinzufügen bestaetigungsButton.addActionListener(this); abbruchButton.addActionListener(this); stopButton.addActionListener(this); //ordnungsgemaesse Beendigung beim Schliessen des Windows setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //zur Karteneingabe auffordern karteneingabeAuffordernActivity(); //Zustandsobjekt initialisieren state = new Bereit(); } public void actionPerformed(ActionEvent e) { JButton source = (JButton)e.getSource(); if (source == bestaetigungsButton) bestaetigen(); else if (source == abbruchButton) abbruch(); else if (source == stopButton) beenden(); } private void bestaetigen() { //Delegation an das Zustandsobjekt state = state.bestaetigen(this); } private void abbruch() { //Delegation an das Zustandsobjekt state = state.abbruch(this); } private void beenden() { //Delegation an das Zustandsobjekt state = state.beenden(this); } //Operationen für die Aktivitätszustände public void karteneingabeAuffordernActivity() { display.setText("<>"); display.append("\nAuf Karte gespeicherte Geheimzahl? (Eingabe bestätigen)"); } public String karteEinActivity() { String check = karteLesen(); if (check.equals("lesbar")) { display.setText("Karte lesbar!"); display.append("\nGeheimzahl? (Eingabe bestätigen)"); return "Karte lesbar"; } else if (check.equals("nicht lesbar")) { display.setText("Karte nicht lesbar!"); abschlussActivity(); return "Karte nicht lesbar"; } else return "Error"; } public String geheimzahlEinActivity() { int typedGeheimzahl = (int)pad.getValue(); pad.clear(); String check = geheimzahlUeberpruefen(typedGeheimzahl); if (check.equals("Geheimzahl ok")) { check = konsortium.karteUeberpruefen(); if (check.equals("Karte ok")) { display.setText("Karte ok!"); display.append("\nTransaktionsform? (Bestätigung = Abhebung)"); return "Karte ok"; } else if (check.equals("falsche BLZ")) { display.setText("Karte nicht ok: falsche BLZ!"); abschlussActivity(); return "Karte nicht ok"; } else if (check.equals("Karte gesperrt")) { display.setText("Karte nicht ok: Karte gesperrt!"); abschlussActivity(); return "Karte nicht ok"; } else return "Error"; } else if (check.equals("falsche Geheimzahl")) { display.setText("falsche Geheimzahl!"); display.append("\nGeheimzahl? (Eingabe bestätigen)"); return "Geheimzahl falsch"; } else return "Error"; } public void abhebungActivity() { display.setText("Betrag? (Eingabe bestätigen)"); } public String betragEinActivity() { double betrag = pad.getValue(); pad.clear(); String check = grenzenUeberpruefen(betrag); if (check.equals("Grenzen ok")) { check = konsortium.transaktionVerarbeiten(); if (check.equals("Transaktion erfolgreich")) { geldvorrat = geldvorrat-betrag; display.setText("Transaktion erfolgreich!"); display.append("\nGeld wird ausgegeben"); display.append("\nGeld entnehmen? (Bestätigung)"); return "Transaktion erfolgreich"; } else if (check.equals("Transaktion gescheitert")) { display.setText("Transaktion gescheitert!"); display.append("\nTransaktionsform? (Bestätigung = Abhebung)"); return "Transaktion gescheitert"; } else return "Error"; } else if (check.equals("Grenzen überschritten")) { display.setText("Grenzen überschritten!"); display.append("\nBetrag? (Eingabe bestätigen)"); return "Grenzen überschritten"; } else return "Error"; } public void geldEntnehmenActivity() { display.setText("Fortsetzung? (Bestätigung = Nein)"); } public void abschlussActivity() { pad.clear(); display.append("\nBeleg wird gedruckt"); display.append("\nKarte wird ausgegeben"); display.append("\nKarte und Beleg entnehmen? (Bestätigung)"); } //private Operationen für Subaktivitäten private String karteLesen() { aktGeheimzahl = (int)pad.getValue(); pad.clear(); return "lesbar"; } private String geheimzahlUeberpruefen(int tgz) { if (tgz == aktGeheimzahl) return "Geheimzahl ok"; else return "falsche Geheimzahl"; } private String grenzenUeberpruefen(double b) { if (b <= grenzen) return "Grenzen ok"; else return "Grenzen überschritten"; } } =============================================== **Datei KeyPad.java: package atm; import java.awt.*; import java.awt.event.*; import javax.swing.*; //angelehnt an "C. Horstmann: Computing Concepts with Java2 Essentials" (S. 601) class KeyPad extends JPanel implements ActionListener { private JTextField display; public KeyPad() { setLayout(new BorderLayout()); display = new JTextField(); add(display, "North"); JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new GridLayout(4, 3)); addButton(buttonPanel, "1"); addButton(buttonPanel, "2"); addButton(buttonPanel, "3"); addButton(buttonPanel, "4"); addButton(buttonPanel, "5"); addButton(buttonPanel, "6"); addButton(buttonPanel, "7"); addButton(buttonPanel, "8"); addButton(buttonPanel, "9"); addButton(buttonPanel, "."); addButton(buttonPanel, "0"); addButton(buttonPanel, "Cl"); add(buttonPanel, "Center"); } private void addButton(JPanel buttonPanel, String label) { JButton button = new JButton(label); buttonPanel.add(button); button.addActionListener(this); } public void actionPerformed (ActionEvent e) { JButton source = (JButton)e.getSource(); String label = source.getText(); if (label.equals("Cl")) clear(); else display.setText(display.getText()+label); } public double getValue() { return Double.parseDouble(display.getText()); } public void clear() { display.setText(""); } } =============================================== **Datei State.java: package atm; /* Das folgende Programm realisiert das Zustandsdiagramm der ATM-Simulation durch Zustandsobjekte (vgl. auch das State-Pattern) */ import java.awt.*; import java.awt.event.*; import javax.swing.*; abstract class State { public State bestaetigen(ATM atm) { return this; } public State abbruch(ATM atm) { return this; } public State beenden(ATM atm) { return this; } } class Bereit extends State { public State bestaetigen(ATM atm) { String check = atm.karteEinActivity(); if (check.equals("Karte lesbar")) return new KarteGelesen(); else if (check.equals("Karte nicht lesbar")) return new BereitZurKartenentnahme(); else return this; } public State beenden(ATM atm) { System.exit(0); return this; } } class KarteGelesen extends State { public State bestaetigen(ATM atm) { String check = atm.geheimzahlEinActivity(); if (check.equals("Karte ok")) return new GeheimzahlUndKarteGeprueft(); else if (check.equals("Karte nicht ok")) return new BereitZurKartenentnahme(); else if (check.equals("Geheimzahl falsch")) return new KarteGelesen(); //oder einfacher: return this; else return this; } public State abbruch(ATM atm) { atm.abschlussActivity(); return new BereitZurKartenentnahme(); } } class GeheimzahlUndKarteGeprueft extends State { public State bestaetigen(ATM atm) { atm.abhebungActivity(); return new TransaktionsformBestimmt(); } public State abbruch(ATM atm) { atm.abschlussActivity(); return new BereitZurKartenentnahme(); } } class TransaktionsformBestimmt extends State { public State bestaetigen(ATM atm) { String check = atm.betragEinActivity(); if (check.equals("Transaktion erfolgreich")) return new TransaktionDurchgefuehrt(); else if (check.equals("Transaktion gescheitert")) return new GeheimzahlUndKarteGeprueft(); else if (check.equals("Grenzen berschritten")) return new TransaktionsformBestimmt(); //oder einfacher: return this; else return this; } public State abbruch(ATM atm) { atm.abschlussActivity(); return new BereitZurKartenentnahme(); } } class TransaktionDurchgefuehrt extends State { public State bestaetigen(ATM atm) { atm.geldEntnehmenActivity(); return new GeldEntnommen(); } } class GeldEntnommen extends State { public State bestaetigen(ATM atm) { atm.abschlussActivity(); return new BereitZurKartenentnahme(); } } class BereitZurKartenentnahme extends State { public State bestaetigen(ATM atm) { atm.karteneingabeAuffordernActivity(); return new Bereit(); } } =============================================== **Datei Konsortium.java: package konsortium; import interfaces.*; //import Ikonsortium; //import Ibank; import java.util.*; public class Konsortium implements Ikonsortium { private String name; //zur Darstellung der qualif. Assoz. zu Ibank private Map banken = new HashMap(); //Bei der Konstruktion des Konsortiums wird genau eine Bank eingefügt public Konsortium(Ibank b) { banken.put(new Integer(101), b); } public String karteUeberpruefen() { String check = blzUeberpruefen(); if (check.equals("BLZ richtig")) { Ibank b = (Ibank)banken.get(new Integer(101)); check = b.bankKarteUeberpruefen(); if (check.equals("Karte ok")) return "Karte ok"; else if (check.equals("Karte bei Bank gesperrt")) return "Karte gesperrt"; else return "Error"; } else if (check.equals("BLZ falsch")) return "falsche Bankleitzahl"; else return "Error"; } public String transaktionVerarbeiten() { Ibank b = (Ibank)banken.get(new Integer(101)); String check = b.bankTransaktionVerarbeiten(); if (check.equals("Banktransaktion erfolgreich")) return "Transaktion erfolgreich"; else if (check.equals("Banktransaktion gescheitert")) return "Transaktion gescheitert"; else return "Error"; } //Dummy-Implementierung private String blzUeberpruefen() { return "BLZ richtig"; // return "BLZ falsch"; } } =============================================== **Datei Bank.java: package bank; import interfaces.Ibank; public class Bank implements Ibank { private int blz; private String name; public String bankKarteUeberpruefen() { String check = kartennrUeberpruefen(); if (check.equals("gueltig")) return "Karte ok"; else if (check.equals("gesperrt")) return "Karte bei Bank gesperrt"; else return "Error"; } public String bankTransaktionVerarbeiten() { String check = kontoAktualisieren(); if (check.equals("erfolgreich")) return "Banktransaktion erfolgreich"; else if (check.equals("gescheitert")) return "Banktransaktion gescheitert"; else return "Error"; } /* Die folgenden Operationen haben lediglich Dummy-Implementierungen zum Testen der ATM Simulation */ private String kartennrUeberpruefen() { return "gueltig"; // return "gesperrt"; } private String kontoAktualisieren() { return "erfolgreich"; // return "gescheitert"; } }