Die Beispiele in diesem Artikel teilen sich den Design- und Implementierungscode von Java Shopping System für Ihre Referenz. Der spezifische Inhalt ist wie folgt
1. Anforderungenanalyse und Klassifizierung des Einkaufssystems
Das Einkaufssystem selbst ist ein sehr komplexes System mit vielen Details und Problemen, die komplizierter sind, wenn Sie sie tief studieren. Darüber hinaus ist das General Shopping -System einen Webseiten -Typ und muss über eine freundliche Schnittstelle verfügen. Als einfaches Projekt besteht dieses Projekt jedoch nur darin, Anfängern von Java die grundlegenden Ideen der Entwicklung vorzustellen und Rahmenbedingungen und Implementierungsprozesse zu entwerfen, wenn sie objektorientiert sind. Daher handelt es sich nur um ein einfaches Projekt, das auf Eclipse basiert, ohne die GUI-Beteiligung, und viele Details und Themen werden als Follow-up-Forschung verwendet. Das Gesamtdesign ist relativ einfach, aber es reicht aus, um viele Designideen und Designkonzepte zu erklären. Die Grundbedürfnisse werden also nachstehend analysiert.
Als einfaches Einkaufssystem müssen Sie mindestens die folgenden Funktionen haben (diese Funktionen sind in verschiedenen Menüsebenen verteilt):
(1) Funktionsanmeldungsfunktion und Benutzerkennwort -Änderung der Benutzerkennkennwort. Die Registrierungsfunktion ist vorerst nicht verfügbar.
(2) Nachdem sich der Benutzer erfolgreich angemeldet hat, muss er die Funktion des Kundeninformationsmanagements, die Einkaufsrechtsfunktion und einige Lotterieaktivitäten haben.
(3) Es gibt viele Funktionen, die unter die Funktion des Kundeninformationsmanagements unterteilt werden können, wie z. B. Abfrage, Änderung, Zusatz usw.;
(4) Es gibt viele Funktionen, die unter die Einkaufsabrechnungsfunktion unterteilt werden können, wie z. B. Produktauswahl, Zahlung, Abrechnung usw.;
(5) Unter der Lotterie können verschiedene Lotterieformen entworfen werden, die in viele neue Funktionsmodule unterteilt werden können.
(6) Die Funktion des Verlassens des Systems sollte im Menü der ersten Ebene bereitgestellt werden, die Funktion der Anmeldung aus dem Menü der zweiten Ebene sollte im Menü der zweiten Ebene bereitgestellt werden, und andere Menüs sollten in das vorherige Menü zurückkehren können.
Die obigen Funktionen sind relativ grundlegende Funktionen. Wenn Sie gemäß der prozessorientierten Idee entwerfen, werden Sie viele funktionale Module teilen und dann Schritt für Schritt den Prozess befolgen. Aber jetzt verwenden wir die objektorientierte Idee, um zu entwerfen. Wie sollten wir den Entwurfsgerüst betrachten? Die Hauptidee von objektorientiertem Objekt besteht darin, einige Anforderungen in viele Klassen abstrahieren und dann Verbindungen zwischen diesen Klassen herzustellen. Durch die kollaborative Zusammenarbeit zwischen verschiedenen Klassen können alle Funktionen erreicht werden. Daher ist die Hauptaufgabe nun, wie man diese Klassen vernünftig abstrahiert, welche Funktionen werden diese Klassen implementieren und welche Verbindungen zwischen den Klassen sind? Das Folgende ist eine Analyse dieses Prozesses basierend auf der Struktur dieses Designs.
(1) StartsMS -Klasse: Wird für das Systemstart verwendet. Unser System braucht definitiv eine Startkurs. Diese Klasse enthält die Hauptmethode, um das System zu starten. Diese Klasse befindet sich auf der obersten Ebene und kann also nicht zu viele zugrunde liegende Details beinhalten. Es muss nur einige grundlegende Prozesse auf höchstem Niveau implementieren. Die Hauptsache ist, einige Methoden anderer zugrunde liegender Klassen aufzurufen, um Funktionen zu implementieren.
(2) Datenklasse: Wird verwendet, um alle unsere Dateninformationen zu speichern. Dieses Design speichert hauptsächlich einige vorgelagerte Produktinformationen zum Kauf und registrierten Mitgliederinformationen. Warum brauchst du diese Klasse? Denken Sie darüber nach, in objektorientiertem Design haben wir viele Daten, und wir dürfen sie nicht überall zerstreuen und ändern. Dadurch wird die Systemaggregation zu niedrig, anfällig für viele Fehler, und es ist schwierig, eine spätere Funktionserweiterung und Fehleränderung durchzuführen. Daher müssen wir einige der verwendeten öffentlichen Daten klassifizieren und dann in eine Klasse einfügen und Methoden zur Verfügung stellen, um diese Daten in dieser Klasse zu betreiben.
(3) Menüklasse: Wird verwendet, um Menüs auf allen Ebenen anzuzeigen und zu verarbeiten. Da wir ein Einkaufssystem entwerfen, benötigen wir ein grundlegendes Menü, um mit Benutzern zu interagieren. Da es viele Menüs gibt und die Menüs auf jeder Ebene Schicht für Schicht miteinander verbunden sind, müssen wir die Menüs gleichmäßig verwalten, sodass die Menükategorie angezeigt wird. Beachten Sie, dass das Menü hier nur einiges an oberster Menü angezeigt wird und grundlegende Funktionsaufrufe. Der spezifische zugrunde liegende Algorithmus muss noch durch zugrunde liegende Klassen implementiert werden.
(4) Managerklasse: Wird zum Speichern des Benutzerkontos und des Kennworts verwendet. Da wir uns anmelden müssen, müssen wir auf jeden Fall eine separate Klasse benötigen, um das Konto und das Kennwort des Benutzers zu verwalten, damit das System unabhängiger ist. Der diesmal entworfene Benutzer verfügt über nur ein Konto und Kennwort, und nur Änderungen dürfen am Konto und das Passwort vorgenommen werden, aber die Registrierung ist nicht zulässig.
(5) Überprüfungsklasse: Wird zur Überprüfung der Anmeldeinformationen verwendet. Diese Klasse entspricht der Zusammenfassung der Anmeldefunktion in eine Klasse. Diese Implementierung ist eigentlich nicht sehr notwendig, aber um die Systemfunktionsabteilung klarer zu machen, soll diese Klasse die Anmeldeinformationen und vorhandenen Konten und Kennwörter überprüfen und damit das Überprüfungsergebnis angeben.
(6) Kursmanagementklasse: Wird zur Verwaltung von Kundeninformationen verwendet. Diese Klasse implementiert einige zugrunde liegende Funktionen wie Abfrage, Änderung, Ergänzung usw. Wenn wir das Menü des Kundeninformationsmanagements eingeben, müssen wir viele Vorgänge für die Kundeninformationen durchführen. Um die Verwaltung dieser Operationen zu erleichtern und die anschließende Erweiterung zu berücksichtigen, werden alle Funktionen des Kundeninformationsmanagements hier abstrahiert und in dieser Kategorie platziert. Das vorherige Menü erkennt die Verwaltung von Kundeninformationen, indem Sie die Methoden in dieser Klasse aufrufen.
. Das Prinzip dieser Klasse ist im Grunde dasselbe wie die obige Klasse. Wenn ein Kunde einkaufen möchte, muss es viele Operationen geben, z. B. was zu kaufen ist, wie viel Geld, Zahlung, Veränderung usw. Diese Funktionen sind relativ fragmentiert. Daher verwalten wir sie zentral, wodurch diese Klasse abstrahiert und den zugrunde liegenden Algorithmus für Menüoptionen für Einkäufe und Siedlung implementiert wird. Das vorherige Menü erkennt die Einkaufs- und Siedlungsfunktionen, indem Sie die Methode dieser Klasse aufrufen und zum vorherigen Menü zurückkehren.
(8) Geschenkmanagementklasse: Verwandte Funktionen, mit denen Lotterieaktivitäten behandelt werden. Die Gründe für die Existenz dieser Klasse sind im Grunde die gleichen wie in (6) und (7). Diese Klasse verwaltet die Lotterieaktivitäten einheitlich. Das vorherige Menü muss nur die Methode dieser Klasse aufrufen, um die Lotteriefunktion zu realisieren.
(9) Geschenkkurs: Verwendet, um Geschenke zu verwalten. Da die Lotteriesitzung gestaltet ist, werden definitiv Geschenke benötigt. Welche Geschenke werden wir also geben? Wir können jedes Geschenk nicht im Detail auflisten. Dies ist sehr überflüssig und problematisch, daher würden wir einfach eine Geschenkkurs abstrahieren und einige Attribute des Geschenks sparen: den Namen und Preis des Geschenks in Mitgliedsvariablen der Klasse. Dann können wir die Klasse problemlos verwalten. Wenn das Geschenk benötigt wird, erstellen Sie ein neues Geschenkobjekt direkt und ändern und verwalten Sie die Attribute des Objekts. Diese Implementierung ähnelt einer Schnittstelle, unterscheidet sich jedoch völlig von der Schnittstelle und hat ähnliche Funktionen.
Kurz gesagt, die oben genannten Klassen werden nach der Unterteilung in einige funktionelle Module abstrahiert, und einige Orte sind nicht unbedingt vernünftig. Sie müssen hauptsächlich die Anforderungen prüfen und unterschiedliche Pläne entsprechend unterschiedlichen Bedürfnissen formulieren. Hier möchte ich wieder den "Geschenkkurs" betonen. Das Design dieser Klasse steht sehr überein mit der objektorientierten Idee. Wenn beispielsweise im Einkaufssystem viele Geschenke benötigt werden, wie z. B. Mobiltelefone, Computer, mobile Netzteile usw., ist der Systemcode, wenn wir diese Geschenke einzeln schreiben, sehr überflüssig. Da die Attribute von Geschenken im Grunde gleich sind, können wir sie in eine Klasse abstrakten, damit wir nur ein Objekt definieren können, wenn wir ein Geschenk benötigen, und dann bestimmte Attribute geben können. Wenn wir beispielsweise ein Mobiltelefon oder einen Computer benötigen, müssen wir nur ein Geschenkklassenobjekt neu und dann seine Attribute auf ein Mobiltelefon einstellen, wenn wir ein Mobiltelefon benötigen, seine Attribute auf einen Computer einstellen, wenn wir einen Computer benötigen, und einstellen, was wir benötigen. Dies macht unseren Code vereinfacht und die Struktur klarer. In komplexeren Systemen ist es tatsächlich vernünftiger, eine Schnittstelle zur Implementierung von Geschenken zu verwenden, damit verschiedene Geschenkkategorien gemäß der Schnittstelle implementiert werden können, wodurch unterschiedliche Anforderungen erfüllt werden können. Es ähnelt der USB -Schnittstelle auf unserem Computer. Mit dieser Schnittstelle können wir viele verschiedene periphere Geräte anschließen, und die Wahrheit ist ähnlich.
2. Die Beziehung und der Prozess zwischen Klassen im Einkaufssystem (in grafischer Form bezeichnet)
Die folgende Abbildung zeigt die Beziehung zwischen diesen 9 Klassen, die ich mit dem Microsoft Office Visio 2003 -Zeichenwerkzeug verwendet habe.
Aus der obigen Abbildung können wir die Beziehung zwischen verschiedenen Typen deutlich erkennen. Die allgemeine Beziehung und der allgemeine Prozess sind wie folgt:
(1) Die StartsMS -Klasse ist eine Start -Klasse -Klasse, die die Hauptmethode enthält. Diese Klasse definiert Objekte der VerifyEqual -Klasse und Datenklasse, um Daten und Verifizierungsinformationen zu speichern. Gleichzeitig enthält die Datenklasse die Managerklasse, um vorgespannte Benutzerkontoinformationen zu speichern. Anschließend wird die Methode von ShowloginMenu () in der Menüklasse in der Hauptmethode in der Hauptmethode aufgerufen, um den Menü der ersten Stufe zu verarbeiten-Login-Modifikationsprozess.
(2) Wenn die Anmeldung erfolgreich ist, rufen Sie die Showmainmenu () -Methode in der Menüklasse an, um den Hauptprozess des Menüs der zweiten Ebene zu verarbeiten-das Einkaufssystem. Wenn der Anmeldung dreimal fehlschlägt, beenden Sie das System direkt.
(3) In der Methode showMainMenu () in der Menüklasse wird durch die Auswahl verschiedener sekundärer Menüoptionen die Methode von ShowCustMMenu () in der Menüklasse aufgerufen, um den Prozess des Kundeninformationsmanagements zu verarbeiten oder die ShowsendMenu () -Methode in der Menüklasse zu bearbeiten, um den Lotterieprozess zu bearbeiten, oder um die CalcPrice () -Methode in der Pay -Klasse zu bearbeiten, um den Einkaufsabrechnungsprozess zu bearbeiten.
(4) Wenn die Option für Kundeninformationsverwaltung im sekundären Menü ausgewählt ist, wird die Methode showCustMMenu () in der Menüklasse aufgerufen. In dieser Methode werden verschiedene Methoden in der Kund Management -Klasse aufgerufen, um unterschiedliche Vorgänge im Kundeninformationsmanagement zu erledigen.
(5) Wenn die Einkaufsabrechnungsoption im sekundären Menü ausgewählt ist, wird die Methode calcPrice () in der Gehaltsklasse aufgerufen, um den Einkaufsabwicklungsprozess zu verarbeiten. Beachten Sie, dass die Methode getDiscount () in der Gehaltsklasse verwendet wird, um den Abzinsungssatz basierend auf Kundenmitgliedern zu berechnen.
(6) Wenn die aufrichtige Feedback -Option im sekundären Menü ausgewählt ist, d. H. Die Lotterie, wird die Methode showendMenu () in der Menüklasse aufgerufen. Diese Methode nennt verschiedene Methoden in der Geschenkmanagement -Klasse, um unterschiedliche Operationen der Lotterie zu erledigen.
Beachten Sie, dass es in der Verwaltungskurs und in der Giftmanagement -Klasse eine ReturnLastMenu () -Methode gibt, mit der zum vorherigen Menü zurückgekehrt wird.
A. Code -Implementierung
Eine Sache zu beachten ist, dass diese Codes in das Cn.itcast -Paket platziert werden sollten.
3.1 Startsms -Klasse
Paket cn.itcast; import Java.util.scanner; / ** * Diese Klasse ist die Hauptmethodenklasse dieses Systems, mit der das Einkaufssystem begonnen wird Data.initial (); // Erstellen Sie ein Objekt im Menüklassenmenü = Neues Menü (); // Hier werden die initialisierten vorhandenen Dateninformationen an das Menüobjektmenü gesendet. // Zeigen Sie das Menü erster Ebene an, dh das Menü Anmeldestell. // Dieses Flag wird verwendet, um festzustellen, ob ein Systembetriebsfehler aufgetreten ist. Wenn die Operation falsch ist, ist das Flag falsch, um das System zu verlassen. Der Standard ist kein Fehler boolean Flag = true; // Verarbeitung des gesamten Systemprozesses do {// Ein Betriebsfehler tritt auf, beenden Sie das System, wenn (! Flag) break; // Erstellen Sie ein Objekt, das überprüft, ob der im Konto und das Kennwort angemeldete Benutzer korrekt ist. Hier werden nur Objekte erstellt, und die Überprüfungsmethode VerififyEqual wird nicht ausgeführt. verifyEqual = new verifyEqual (); // Geben Sie die Auswahl im Menü Scanner Scanner der ersten Ebene ein. int i = scanner.nextint (); // Machen Sie unterschiedliche Antworten auf die Auswahl des Menüs erster Ebene. Beachten Sie, dass dies der klassische Switch-Case-Nutzungsschalter (i) {Fall 1: // Benutzer "Anmeldesystem" auswählt // einen Zähler definieren, was bedeutet, dass der Benutzer höchstens dreimal versuchen kann und das System direkt mit 3 Eingangsfehlern int j = 3 beenden kann. // Verarbeitungsprozess für die Anmeldung im System do {if (verifyequal.verify (data.manager.username, data.manager.password)) {// Der Benutzer, der erfolgreich angemeldet ist, und das Einkaufsmenü der zweiten Ebene wird angezeigt! ! ! Menü.ShowmainMenu (); brechen; } if (j! = 1) {// Die Benutzereingabe ist falsch und hat nicht dreimal erreicht. Neu eingeben system.out.println ("/n der Benutzername und das Kennwort nicht übereinstimmen, bitte eintreten:"); } else {// Die 3 Versuche enden, das Exit-Flag einstellen und das Do-while-Loop-System beenden.out.println ("/nyou haben keine Erlaubnis, das System einzugeben! Danke!"); Flag = Falsch; brechen; } // Decrement den Zähler jedes Mal, wenn Sie eintreten, um anzuzeigen, wie oft J- } while (wahr); brechen; Fall 2: // Der Benutzer wählt "Administratorinformationen ändern" if (verifiifyequal.verify (data.manager.username, data.manager.password)) {// Bevor Sie neue Informationen eingeben, müssen Sie die ursprünglichen Informationen überprüfen. Dies bedeutet, dass die Überprüfung erfolgreich war. System.out.print ("Bitte geben Sie den neuen Benutzernamen ein:"); Data.Manager.username = scanner.Next (); System.out.print ("Bitte geben Sie das neue Passwort ein:"); Data.Manager.Password = scanner.Next (); System.out.println ("Benutzername und Passwort wurden geändert!"); // Die Informationen wurden erfolgreich geändert. Wählen Sie das nächste Betriebssystem.out.println ("/nPlease auswählen, die Nummer eingeben:"); } else {// Informationsüberprüfung fehlgeschlagen, setzen Sie das Exit -Flag -System. Flag = Falsch; } brechen; Fall 3: // Der Benutzer wählt "exit" system.out.println ("Vielen Dank für Ihre Verwendung!"); System.exit (0); brechen; Standard: // Die Menüeingabe erster Stufe ist falsch, und Sie müssen system.out.print neu ausgewählt werden ("/n Eingabe ist falsch! Bitte wählen Sie erneut die Nummer ein und geben Sie die Nummer ein:"); brechen; }} while (Flag); }}3.2 Datenklasse
Paket cn.itcast; /*** Die Datenklasse, die die Initialisierungsdaten des Einkaufssystems speichert. Diese Klasse speichert nur die vorhandenen Produktinformationen und Kundeninformationen * * @Author * * / öffentliche Klassendaten { / ** * Der Standardkonstruktor, der Variablen initialisierte. Da es sich um alle Array -Objekte oder Klassenobjekte handelt, müssen sie alle neue * */ public Data () {GoodsName = New String [50] verwenden; goodsprice = neues doppelt [50]; CustNO = New int [100]; CustBirth = New String [100]; CustCore = New int [100]; Manager = neuer Manager (); } / *** Initialisieren Sie die Daten dieser Klasse** / public void initial () { /*============================================================= =========================================================/ GoodsName [0] = "Addidas Sneakers"; GoodSprice [0] = 880D; Warenname [1] = "Kappa -Tennisrock"; GoodSprice [1] = 200D; Warenname [2] = "Top -Schläger"; GoodSprice [2] = 780D; GoodsName [3] = "Addidas T-Shirt"; GoodSprice [3] = 420.7799999999999997d; Warenname [4] = "Nike Sneakers"; GoodSprice [4] = 900D; Warenname [5] = "Kappa Tennis"; GoodSprice [5] = 45D; Warenname [6] = "Kappat-Shirt"; GoodSprice [6] = 245D; /*========================================================================================================ieben =====================================================================ieben =====================================================================ieben =====================================================================ieben CustNo [1] = 1711; CustDross [1] = "07/13"; CustCore [1] = 4000; CustNo [2] = 1623; CustdBirth [2] = "06/26"; CustCore [2] = 5000; CustNo [3] = 1545; CustdBirth [3] = "04/08"; CustCore [3] = 2200; CustNo [4] = 1464; CustDerth [4] = "08/16"; CustCore [4] = 1000; CustNo [5] = 1372; Custdrueth [5] = "12/23"; CustCore [5] = 3000; CustNo [6] = 1286; CustdBirth [6] = "12/21"; CustCore [6] = 10080; } /*=======================================================ieben ==================================================================ieben ==================================================================ieben ==================================================================ieben Der Geburtstag des Kunden öffentlich int CustCore []; // Pounds Public Manager des Kunden; // Administratorklasse, nur der Benutzername und das Passwort des Administrators}}3.3 Managerklasse
Paket cn.itcast; / ** * Administratorklasse, speichert nur den Benutzernamen und das Passwort des Administrators * * @Author * */ public class Manager {/ ** * Setzen Sie den Standard -Benutzernamen und den Standardnamen und das Passwort * */ public Manager () {userername = "itcast"; password = "itcast"; } /*================================ Definieren Sie die Variablen, die diesem gehören class============================================================================================= ===========================================================================================================ieben ===========================================================================================================ieben =====================================================================ieben3.4 Überprüfungsklasse
Paket cn.itcast; import Java.util.scanner; / *** Klasse, die überprüft, ob der Benutzer angemeldet ist. Benutzername System.out.print ("Bitte geben Sie den Benutzernamen ein:"); Scanner scanner = neuer Scanner (System.in); String s2 = scanner.Next (); // Geben Sie das Kennwort aus dem Benutzersystem ein. Scanner = neuer Scanner (System.in); String s3 = scanner.next (); // Bestimmen Sie, ob die vom Benutzer eingegebenen Informationen mit den vorhandenen Informationen übereinstimmen, die s2.equals (s) && s1.equals (S3) zurückgeben; }}3.5 Menüklasse
Paket cn.itcast; import Java.util.scanner; / ** * Menüklasse, verwendet, um alle Ebenen von Menüs für die Benutzerauswahl anzuzeigen als [], double ad [], int ai [], String as1 [], int ai1 []) {GoodsName = as; goodsprice = ad; CustNo = ai; CustDerth = As1; CustCore = ai1; }/*** Zeigen Sie das Menü der ersten Ebene an, dh die Anmeldeschnittstelle**/public void showloginMenu () {System.out.println ("/n/n/t/t/t/t/t Willkommen bei ITCast Shopping Management System Version 1.0/N/N"); System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * System.out.println ("/t/t/t/t 1. System.out.println ("/t/t/t/t/t 3. exit/n/n"); * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /** * Display the secondary menu, that is, the main menu of the system. Diese Methode enthält alle Prozesse für die Verarbeitung dieses Menüs * */public void showMainmenu () {// Das Sekundärmenü anzeigen, dh das Hauptmenü des Systems System.out.println ("/n/n/t/t/t/t/t/t/t/t Begrüßung im Einkaufsmanagementsystem/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Kundeninformationsmanagement/n "); System.out.println ("/t/t/t/t 2. System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * User wählt den service system.print aus ("plitt, den number:"); Flag = False; Einkaufsabrechnungsverfahren = neuer Pay () Pay.SetData (GoodsName, Güterpreis (S.Equals ("4") {// Das Menü der ersten Ebene kehrt zum ersten Starts-Menü auf. void showcustmmenu () {System.out.println ("Einkaufsmanagementsystem> Kundeninformationsmanagement/n"); * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * System.out.println ("/t/t/t 2. Kundeninformationen hinzufügen/n"); * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * System. Noch die Originaldaten. {Custommanagement.Add (); showMainMenu () break; System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *) Logge. System.out.println ("/t/t/t/t/t 3. Geburtstagsgruß/n"); * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Scanner (System.in); GiftManagement.SendgoldCust (); (S.Equals ("n") {ShowMainMenu (); /*=====================================================================================*/ public String goodsName []; // product name public double goodsPrice[]; // product price public int custNo []; // customer membership number public String custBirth []; // customer's birthday public int custScore []; // customer's points}3.6 CustManagement类
package cn.itcast; import java.util.Scanner; /** * Customer information management class* * @author * */ public class CustManagement { /** * Empty constructor* */ public CustManagement() { } /** * Set data information of customer information management class* * @param as * @param ad * @param ai * @param ai * @param as1 * @param ai1 */ public void setData(String as[], double ad[], int ai[], String as1[], int ai1[]) { goodsName = as; goodsPrice = ad; custNo = ai; custBirth = as1; custScore = ai1; } /** * Return to the previous menu, i.e. the second-level menu-customer information management menu* */ public void returnLastMenu() { System.out.print("/n/nPlease press 'n' to return to the previous menu:"); Scanner scanner = new Scanner(System.in); boolean flag = true; do if (scanner.next().equals("n")) { // Return to the previous menu, a new menu object was created here, but in the user's opinion, the same processing flow is actually the same, // However, for the program, a new secondary menu processing process has begun. Menu menu = new Menu(); menu.setData(goodsName, goodsPrice, custNo, custBirth, custScore); menu.showCustMMenu(); } else { System.out.print("Input error, please 'n' return to the previous menu: "); Flag = Falsch; } while (!flag); } /** * Add customer information* */ public void add() { System.out.println("Shopping Management System> Customer Information Management> Add customer information/n/n"); Scanner scanner = new Scanner(System.in); System.out.print("Please enter the member number (<4-digit integer>):"); int i = scanner.nextInt(); System.out.print("Please enter the member's birthday (month/day <denoted in two digits>):"); String s = scanner.next(); System.out.print("Please enter the integral:"); int j = scanner.nextInt(); int k = -1; int l = 0; do { if (l >= custNo.length) break; // Find the first empty location in the array to store new customer information if (custNo[l] == 0) { k = l; brechen; } l++; } while (true); custNo [k] = i; custBirth[k] = s; custScore[k] = j; System.out.println("New member added successfully!"); // Return to the previous menu returnLastMenu(); } /** * Modify customer information* */ public void modify() { System.out.println("Shopping Management System> Customer Information Management> Modify customer information/n/n"); System.out.print("Please enter the member number:"); Scanner scanner = new Scanner(System.in); int i = scanner.nextInt(); System.out.println(" member number birthday points"); System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- .append(custScore[k]).toString()); j = k; break; } k++; } while (true); // The member exists, then modify the information process if (j != -1) { System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /n"); System.out.println("/t/t/t1. Modify the member's birthday./n"); System.out.println("/t/t/t/t2.Modify member points./n"); System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /n"); System.out.print("Please select, enter the number: "); switch (scanner.nextInt()) { case 1: // "Modify member's birthday" System.out.print("Please enter the modified birthday: "); custBirth[j] = scanner.next(); System.out.println("Birthday information has been changed!"); break; case 2: // "Modify member points" System.out.print("Please enter the modified member points: "); custScore[j] = scanner.nextInt(); System.out.println("Member points have been changed!"); break; } } else { System.out.println("Sorry, there is no member you query."); } // Return to the previous menu returnLastMenu(); } /** * Query customer information* */ public void search() { System.out.println("Shopping Management System> Customer Information Management> Query Customer Information/n"); Scanner scanner = new Scanner(System.in); for (String s = "y"; s.equals("y"); s = scanner.next()) { System.out.print("Please enter the membership number: "); int i = scanner.nextInt(); System.out.println("Member number birthday points"); System.out.println("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 0; do { if (j >= custNo.length) break; // Show the information of the member if (custNo[j] == i) { System.out.println((new StringBuilder()).append(custNo[j]) .append("/t/t").append(custBirth[j]).append("/t/t") .append(custScore[j]).toString()); flag = true; break; } j++; } while (true); if (!flag) System.out.println("Sorry, there is no member information you query."); System.out.print("/nDo you want to continue querying (y/n):"); } // Return to the previous menu returnLastMenu(); } /** * Show all customer information* */ public void show() { System.out.println("Shopping Management System> Customer Information Management> Show customer information/n/n"); System.out.println("Member number birthday points"); System.out.println("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- System.out.println((new StringBuilder()).append(custNo[j]).append( "/t/t").append(custBirth[j]).append("/t/t").append(custScore[j]).toString()); // Return to the previous menu returnLastMenu(); } /*======================================================================================================= ========================================================================================================= ========================================================================================================= ========================================================================================================= custNo []; // Customer’s membership number public String custBirth []; // Customer’s birthday public int custScore []; // Customer’s points}3.7 Pay类
package cn.itcast; import java.util.Scanner; /** * Class that handles customers' purchases and settlements* * @author * */ public class Pay { /** * Empty constructor* */ public Pay() { } /** * Set data information of shopping settlement class* * @param as * @param ad * @param ai * @param ai * @param as1 * @param ai1 */ public void setData(String as[], double ad[], int ai[], String as1[], int ai1[]) { goodsName = as; goodsPrice = ad; custNo = ai; custBirth = as1; custScore = ai1; } /** * Determine the discount rate based on member information* * @param i * @param ai * @param ai * @param ai1 * @return */ public double getDiscount(int i, int ai[], int ai1[]) { int j = -1; int k = 0; do { if (k >= ai.length) break; if (i == ai[k]) { j = k; brechen; } K ++; } while (true); double d; if (ai1[j] < 1000) d = 0.94999999999999999999999996D; else if (1000 <= ai1[j] && ai1[j] < 2000) d = 0.900000000000000000000002D; else if (2000 <= ai1[j] && ai1[j] < 3000) d = 0.8499999999999999999999999999999999999999999999999999999999 99999999999999999999999999999999999999999999999999999999996D; else if (1000 <= ai1[j] && ai1[j] < 4000) d = 0.8000000000000000000004D; else if (4000 <= ai1[j] && ai1[j] < 6000) d = 0.75D; else if (6000 <= ai1[j] && ai1[j] < 8000) d = 0.69999999999999999999996D; else d = 0.5999999999999999998D; Rückkehr D; } /** * Key methods of this class, used to handle shopping and checkout* */ public void calcPrice() { String s2 = ""; double d1 = 0.0D; double d2 = 0.0D; int l = 0; double d4 = 0; System.out.println("Shopping Management System> Shopping Checkout/n/n"); System.out.println("************************************************"); System.out.println("Please select the purchased product number: "); // Show all purchaseable product information, the information here is the initial initial product data for (l = 0; l < goodsName.length && goodsName[l] != null; l++) { d4++; System.out.println((new StringBuilder()).append(d4).append(": ") .append(goodsName[l]).append("/t").toString()); } System.out.println("*********************************************/n"); Scanner scanner = new Scanner(System.in); System.out.print("/tPlease enter the member number: "); int i = scanner.nextInt(); // Get discount information based on member information d4 = getDiscount(i, custNo, custScore); String s1; do { System.out.print("/tPlease enter the product number: "); int j = scanner.nextInt(); System.out.print("/tPlease enter the number: "); int k = scanner.nextInt(); double d = goodsPrice[j - 1]; String s = goodsName[j - 1]; d1 += d * (double) k; s2 = (new StringBuilder()).append(s2).append("/n").append(s) .append("/t").append("¥").append(d).append("/t/t") .append(k).append("/t/t").append("¥") .append(d * (double) k).append("/t").toString(); System.out.print("/t continue (y/n)"); s1 = scanner.next(); } while (s1.equals("y")); d2 = d1 * d4; // Total price after discount System.out.println("/n"); System.out.println("***************************************************************************************************************************** System.out.println("Item/t/t unit price/t/t number/t/t amount/t amount/t"); System.out.print(s2); System.out.println((new StringBuilder()).append("/n discount: /t").append(d4).toString()); System.out.println((new StringBuilder()).append("Total amount:/t¥").append(d2).toString()); System.out.print("Actual payment:/t¥"); double d3 = scanner.nextDouble(); System.out.println((new StringBuilder()).append("Find money:/t¥").append(d3 - d2).toString()); int i1 = ((int) d2 / 100) * 3; int j1 = 0; do { if (j1 >= custNo.length) break; if (custNo[j1] == i) { custScore[j1] = custScore[j1] + i1; System.out.println((new StringBuilder()).append("The points obtained in this shopping are: ") .append(i1).toString()); break; } j1++; } while (true); System.out.print("/nPlease 'n' to return to the previous menu:"); if (scanner.next().equals("n")) { // Return to the previous menu, a new menu object was created here, but in the user's opinion, the same processing flow was actually still the same, // However, for the program, a new secondary menu processing flow has started. Menu menu = new Menu(); menu.setData(goodsName, goodsPrice, custNo, custBirth, custScore); menu.showMainMenu(); } } /*=====================================================================================*/ public String goodsName []; // product name public double goodsPrice[]; // product price public int custNo []; // customer membership number public String custBirth []; // customer's birthday public int custScore []; // customer's points}3.8 GiftManagement类
package cn.itcast; import java.util.Scanner; /** * Gift management class* * @author * */ public class GiftManagement { /** * Empty constructor* */ public GiftManagement() { } /** * Set data information of gift management class* * @param as * @param ad * @param ai * @param ai * @param as1 * @param ai1 */ public void setData(String as[], double ad[], int ai[], String as1[], int ai1[]) { goodsName = as; goodsPrice = ad; custNo = ai; custBirth = as1; custScore = ai1; } /** * Return to the previous menu, that is, the second-level menu-true feedback menu* */ public void returnLastMenu() { System.out.print("/n/nPlease press 'n' to return to the previous menu:"); Scanner scanner = new Scanner(System.in); boolean flag = true; do if (scanner.next().equals("n")) { // Return to the previous menu, a new menu object was created here, but in the user's opinion, the same processing flow is actually the same, // However, for the program, a new secondary menu processing process has begun. Menu menu = new Menu(); menu.setData(goodsName, goodsPrice, custNo, custBirth, custScore); menu.showCustMMenu(); } else { System.out.print("Input error, please 'n' return to the previous menu: "); Flag = Falsch; } while (!flag); } /** * Birthday greeting* */ public void sendBirthCust() { System.out.println("Shopping Management System> Birthday greeting/n/n"); System.out.print("Please enter today's date (month/day <indicated in two digits>): "); Scanner scanner = new Scanner(System.in); String s = scanner.next(); System.out.println(s); String s1 = ""; boolesche Flagge = Falsch; for (int i = 0; i < custBirth.length; i++) if (custBirth[i] != null && custBirth[i].equals(s)) { s1 = (new StringBuilder()).append(s1).append(custNo[i]).append( "/n").toString(); Flag = wahr; } // The gift here is fixed, so there is no gift class if (flag) { System.out.println("Birthday members are:"); System.out.println(s1); System.out.println("Congratulations! I received one MP3!"); } else { System.out.println("Members with no birthday today!"); } // Return to the previous menu returnLastMenu(); } /** * Lucky lottery, note that this is a random lottery, so you need a random number. You only need to formulate a lottery rule by yourself* */ public void sendLuckyCust() { System.out.println("Shopping Management System> Lucky lottery/n/n"); System.out.print("Does it start (y/n):"); Scanner scanner = new Scanner(System.in); if (scanner.next().equals("y")) { int i = (int) (Math.random() * 10D); // Generate a random number String s = ""; boolesche Flagge = Falsch; for (int k = 0; k < custNo.length && custNo[k] != 0; k++) { // Compare the random number with the corresponding results of the customer membership number to determine whether a customer wins int j = (custNo[k] / 100) % 10; if (j == i) { s = (new StringBuilder()).append(s).append(custNo[k]) .append("/t").toString(); Flag = wahr; } } // Fixed prize, so there is no need for gifts if (flag) System.out.println((new StringBuilder()).append("Lucky customer gets MP3:") .append(s).toString()); else System.out.println("No lucky customers."); } // Return to the previous menu returnLastMenu(); } /** * Lucky big broadcast, the member with the highest points will be the lucky one, and the prize will be given * */ public void sendGoldenCust() { System.out.println("Shopping Management System> Lucky big broadcast/n/n"); int i = 0; int j = custScore[0]; for (int k = 0; k < custScore.length && custScore[k] != 0; k++) { // Find the member with the highest points if (custScore[k] > j) { j = custScore[k]; i = k; } } System.out.println((new StringBuilder()).append("The member with the highest points is: ").append( custNo[i]).append("/t").append(custBirth[i]).append("/t") .append(custScore[i]).toString()); // Create a gift class and set the gift information. The gift here is a fixed information Gift gift = new Gift(); gift.name = "Apple laptop"; gift.price = 12000D; System.out.print("Congratulations! Received a gift: "); System.out.println(gift); // Return to the previous menu returnLastMenu(); } /*================================================================================================================= ==================================================================================================================== =====================================================ieben ==================================================================================================================== Customer's points}3.9 Gift类
package cn.itcast; /** * Class used to store gifts in true feedback*/ public class Gift { /** * Empty constructor* */ public Gift() { } /** * Return all the information of the gift based on the variables of the gift object* */ public String toString() { return (new StringBuilder()).append("a value ¥").append(price) .append("").append(name).toString(); } /*======================== Define the variables owned by this class=================================================================================== ===============================================================================ieben ===============================================================================ieben ===============================================================================ieben // Gift name public double price; // Gift price}3.10 代码总结
从上面的9个类的代码来看,有一些需要注意的地方:
(1)在许多类中都定义了与Data中基本一样的成员变量,只是没有Manager对象而已,这是为了让数据一层层保存和传递,通过setData()方法实现,不过这种方法其实并不是很好,并且一般来说成员变量应该最好设置为私有的,这里这样的设计是为了操作方便,使系统更简单一些,安全性不好。
(2)注意到所有要进行字符串拼接的地方都使用JAVA中的StringBuilder类,这是为了高效处理字符串拼接,防止String类带来的拼接数据冗余。
(3)这些设计中的流程并不是非常合理,大家可以自己的需要进行修改。
(4)代码中基本上没有考虑异常时的处理,所以当输入时出现错误的时候,普通错误可以进行重新输入,但是如果出现不匹配等错误,直接会出现异常,从而退出系统,这些也是本设计的缺陷,可以通过正则表达式等来完善一些。
总之,给出的代码仅供参考,大家可以根据需要进行修改,这些代码都是经过验证的,可以直接运行。
4. Zusammenfassung
这个设计只是为了说明一些基本的设计思想和设计理念,以及设计过程中需要考虑的问题,主要还是为了说明怎样用面向对象的思想去解决现实生活中的问题,所以设计相对简单,不过希望大家可以通过这个设计理解这些基本的思想,从而帮助大家理想面向对象的基本思想。
In short, language is just a tool to solve problems. You can use other languages such as C++ and C# to implement this system, as long as you have good design concepts and design ideas. Again, this design is for reference only. Everyone is welcome to participate in the discussion. If there are any errors, please correct me. Danke schön.