Les exemples de cet article partagent le code de conception et d'implémentation du système d'achat Java pour votre référence. Le contenu spécifique est le suivant
1. Analyse des exigences et classification du système d'achat
Le système d'achat lui-même est un système très complexe, avec de nombreux détails et problèmes qui seront plus compliqués si vous les étudiez profondément. De plus, le système d'achat général est le type de page Web et doit avoir une interface amicale. Cependant, en tant que projet simple, ce projet est simplement d'introduire les idées de base du développement aux débutants de Java et comment concevoir des cadres et des processus de mise en œuvre lorsqu'ils sont orientés vers l'objet. Par conséquent, ce n'est qu'un projet simple développé basé sur l'éclipse, sans la participation de l'interface graphique, et de nombreux détails et problèmes sont utilisés comme recherche de suivi. La conception globale est relativement simple, mais il suffit d'expliquer de nombreuses idées de conception et concepts de conception. Les besoins de base sont donc analysés ci-dessous.
En tant que système d'achat simple, vous devez avoir au moins les fonctions suivantes (ces fonctions sont distribuées à différents niveaux de menus):
(1) Fonction de connexion de l'utilisateur et fonction de modification du mot de passe du compte utilisateur, la fonction d'enregistrement n'est pas disponible pour le moment;
(2) Une fois que l'utilisateur s'est connecté avec succès, il doit avoir la fonction de gestion des informations client, la fonction de règlement d'achat et certaines activités de loterie;
(3) Il existe de nombreuses fonctions qui peuvent être divisées en dessous de la fonction de gestion des informations du client, telles que: requête, modification, addition, etc.;
(4) Il existe de nombreuses fonctions qui peuvent être divisées en dessous de la fonction de règlement d'achat, telles que: sélection des produits, paiement, facturation, etc.;
(5) Diverses formes de loterie peuvent être conçues sous la loterie, qui peuvent être divisées en de nombreux nouveaux modules fonctionnels.
(6) La fonction de sortie du système doit être fournie dans le menu de premier niveau, la fonction de l'exploitation forestière du menu de deuxième niveau doit être fournie dans le menu de deuxième niveau, et d'autres menus devraient pouvoir revenir au menu précédent.
Les fonctions ci-dessus sont toutes des fonctions relativement basiques. Si vous concevez selon l'idée orientée vers le processus, vous divisez de nombreux modules fonctionnels, puis suivez le processus étape par étape. Mais maintenant, nous utilisons l'idée orientée objet pour concevoir, comment devons-nous considérer le cadre de conception? L'idée principale de l'objet est de résumer certaines exigences dans de nombreuses classes, puis d'établir des connexions entre ces classes. Grâce à une coopération collaborative entre différentes classes, toutes les fonctions peuvent être obtenues. Par conséquent, la tâche principale est maintenant de savoir comment résumer raisonnablement ces classes, quelles fonctions ces classes vont-elles mettre en œuvre et quelles sont les connexions entre les classes? Ce qui suit est une analyse de ce processus basé sur la structure de cette conception.
(1) Classe StartMS: Utilisé pour le démarrage du système. Notre système a définitivement besoin d'une classe de démarrage. Cette classe contient la méthode principale pour démarrer le système. Cette classe est au plus haut niveau, il ne peut donc pas impliquer trop de détails sous-jacents. Il n'a qu'à implémenter certains processus de base de haut niveau. L'essentiel est d'appeler certaines méthodes d'autres classes sous-jacentes pour implémenter des fonctions.
(2) Classe de données: utilisé pour stocker toutes nos informations de données. Cette conception stocke principalement certaines informations sur les produits pré-stockés pour l'achat et les informations enregistrées des membres. Pourquoi avez-vous besoin de cette classe? Pensez-y, dans la conception orientée objet, nous avons beaucoup de données, et nous ne devons pas la définir et la modifier de manière époustouflante partout. Cela rendra l'agrégation du système trop faible, sujette à de nombreuses erreurs, et il est difficile d'effectuer une expansion de fonction ultérieure et une modification des erreurs. Par conséquent, nous devons classer certaines des données publiques utilisées, puis les mettre dans une classe et fournir des méthodes pour faire fonctionner ces données dans cette classe.
(3) Classe de menu: utilisé pour afficher et traiter les menus à tous les niveaux. Étant donné que nous concevons un système d'achat, même s'il est simple, nous avons besoin d'un menu de base pour interagir avec les utilisateurs. Puisqu'il existe de nombreux menus et que les menus à chaque niveau sont connectés de couche par couche, nous devons gérer les menus uniformément, de sorte que la catégorie de menu apparaît. Notez que le menu ici n'est que quelques affichages de menu de niveau supérieur et des appels de fonction de base. L'algorithme sous-jacent spécifique doit encore être mis en œuvre par des cours plus sous-jacents.
(4) Classe de gestionnaire: utilisé pour stocker le compte et le mot de passe de l'utilisateur. Étant donné que nous avons besoin que les utilisateurs se connectent, nous devons certainement avoir besoin d'une classe distincte pour gérer le compte et le mot de passe de l'utilisateur, afin que le système soit plus indépendant. L'utilisateur conçu cette fois n'a qu'un seul compte et un mot de passe, et seuls les modifications sont autorisées à être apportées au compte et au mot de passe, mais l'enregistrement n'est pas autorisé.
(5) Classe de vérification: utilisée pour vérifier les informations de connexion. Cette classe équivaut à résumer la fonction de connexion en une classe. Cette implémentation n'est en fait pas très nécessaire, mais afin de rendre la division des fonctions du système plus claire, cette classe est conçue pour vérifier les informations de connexion et les comptes et mots de passe existants, donnant ainsi le résultat de vérification.
(6) Classe de gestion de la garde: Utilisé pour la gestion des informations client. Cette classe met en œuvre certaines fonctions sous-jacentes, telles que la requête, la modification, l'addition, etc. Afin de faciliter la gestion de ces opérations et de prendre en compte l'expansion ultérieure, toutes les fonctions de gestion de l'information des clients sont résumées ici et placées dans cette catégorie. Le menu précédent réalise la gestion des informations des clients en appelant les méthodes de cette classe.
(7) Classe de rémunération: Utilisé pour gérer les opérations de shopping et de paiement. Le principe de cette classe est fondamentalement le même que la classe ci-dessus. Lorsqu'un client choisit d'acheter, il doit y avoir de nombreuses opérations, telles que ce qu'il faut acheter, combien d'argent, de paiement, de changement, etc. Ces fonctions sont relativement fragmentées, nous les gérons donc de manière centralisée, abstyant ainsi cette classe et mettant en œuvre l'algorithme sous-jacent pour les options de menu pour les achats et les règlements. Le menu précédent réalise les fonctions d'achat et de règlement en appelant la méthode de cette classe et peut revenir au menu précédent.
(8) Classe de gestion des cadeaux: fonctions connexes utilisées pour gérer les activités de loterie. Les raisons de l'existence de cette classe sont fondamentalement les mêmes que celles de (6) et (7). Cette classe gère uniformément les activités de loterie. Le menu précédent n'a qu'à appeler la méthode de cette classe pour réaliser la fonction de loterie.
(9) Classe-cadeau: Utilisé pour gérer les cadeaux. Étant donné que la session de loterie est conçue, des cadeaux sont définitivement nécessaires. Alors, quel genre de cadeaux allons-nous offrir? Nous ne pouvons pas énumérer chaque cadeau en détail. Ceci est très redondant et gênant, donc nous abstracrons simplement une classe de cadeaux et économisons certains attributs du cadeau: le nom et le prix du cadeau dans les variables membres de la classe. Ensuite, nous pouvons facilement gérer la classe. Si le cadeau est nécessaire, créez directement un nouvel objet cadeau, puis modifiez et gérez les attributs de l'objet. Cette implémentation est similaire à une interface, mais elle est complètement différente de l'interface et a des fonctions similaires.
En bref, les classes ci-dessus sont abstraites après avoir été divisées en certains modules fonctionnels, et certains endroits ne sont pas nécessairement raisonnables. Ils ont principalement besoin d'examiner les exigences et de formuler différents plans en fonction des différents besoins. Ici, je veux encore mettre l'accent sur la "classe-cadeau". La conception de cette classe est très cohérente avec l'idée orientée objet. Par exemple, si beaucoup de cadeaux sont nécessaires dans le système d'achat, tels que les téléphones portables, les ordinateurs, les alimentations mobiles, etc., alors si nous écrivons ces cadeaux un par un, le code système sera très redondant. Parce que les attributs des cadeaux sont fondamentalement les mêmes, nous pouvons les abstraire en classe, afin que nous ne puissions définir qu'un seul objet lorsque nous avons besoin d'un cadeau, puis donner certains attributs. Par exemple, si nous avons besoin d'un téléphone mobile ou d'un ordinateur, nous avons besoin de nouveau d'un objet de classe cadeau, puis de définir ses attributs sur un téléphone mobile lorsque nous avons besoin d'un téléphone mobile, définissez ses attributs sur un ordinateur lorsque nous avons besoin d'un ordinateur et définissez tout ce dont nous avons besoin. Cela rend notre code simplifié et la structure plus claire. Dans les systèmes plus complexes, il est en fait plus raisonnable d'utiliser une interface pour implémenter des cadeaux, afin que différentes catégories de cadeaux puissent être implémentées en fonction de l'interface, répondant ainsi aux différents besoins. Il est similaire à l'interface USB sur notre ordinateur. Avec cette interface, nous pouvons brancher de nombreux dispositifs périphériques divers, et la vérité est similaire.
2. La relation et le processus entre les classes du système d'achat (indiqué sous forme graphique)
La figure suivante montre la relation entre ces 9 classes, j'ai utilisé l'outil de dessin Microsoft Office Visio 2003.
D'après la figure ci-dessus, nous pouvons clairement voir la relation entre différents types. La relation générale et le processus sont les suivants:
(1) La classe STARTMS est une classe de démarrage, qui contient la méthode principale. Cette classe définit les objets de la classe et de la classe de données VerifyEqual pour stocker les données et les informations de vérification. Dans le même temps, la classe de données contient la classe Manager pour stocker les informations de compte utilisateur pré-stockées. Ensuite, via certaines logiques dans la méthode principale, la méthode ShowLoginMenu () dans la classe de menu est appelée pour traiter le menu de premier niveau - processus de modification de la logine;
(2) Si la connexion est réussie, appelez la méthode ShowMainMenu () dans la classe de menu pour gérer le processus principal du menu de deuxième niveau - le système d'achat. Si la connexion échoue 3 fois, vous quitterez directement le système;
(3) Dans la méthode ShowMainMenu () dans la classe de menu, en sélectionnant différentes options de menu secondaire, la méthode showcustmmenu () dans la classe de menu est appelée pour gérer le processus de gestion des informations client ou pour appeler la méthode showendMenu () dans la classe de menu pour gérer le processus de règlement de la loterie, ou pour appeler la méthode CalcPrice () dans la classe de paie pour gérer le processus de règlement de l'achat;
(4) Si l'option de gestion des informations client dans le menu secondaire est sélectionnée, la méthode showCustMmenu () dans la classe de menu sera appelée. Cette méthode appellera diverses méthodes dans la classe de gestion de la garde pour gérer différentes opérations dans la gestion de l'information client;
(5) Si l'option de règlement d'achat dans le menu secondaire est sélectionnée, la méthode calcprice () de la classe de paie sera appelée pour gérer le processus de règlement des achats. Notez que la méthode getDiscount () dans la classe de paie est utilisée pour calculer le taux d'actualisation en fonction des informations des membres du client;
(6) Si l'option de rétroaction sincère dans le menu secondaire est sélectionnée, c'est-à-dire la loterie, la méthode showendMenu () dans la classe de menu sera appelée. Cette méthode appellera diverses méthodes dans la classe de gestion des cadeaux pour gérer différentes opérations de la loterie;
Notez qu'il existe une méthode returnLastMenu () dans la classe de gestion de la garde et la classe Giftman de gestion, qui est utilisée pour revenir au menu précédent.
3. Implémentation du code
Une chose à noter est que ces codes doivent être placés dans le package CN.itcast.
3.1 Classe Startms
package cn.itcast; import java.util.scanner; / ** * Cette classe est la principale classe de méthode de ce système, utilisée pour démarrer le système d'achat * * @author * * / classe publique startsms {/ ** * Constructeur vide * * / public starms () {} / ** * Méthode principale du système * * @param args * / public static Main Main (String args []) {// Créer un objet de la classe de données existante et initiale les informations sur les informations du produit existantes; data.Initial (); // Créer un objet du menu de la classe de menu Menu = nouveau menu (); // Ici, les informations de données existantes initialisées sont envoyées au menu Menu Menu.setData (data.goodsname, data.goodsprice, data.custno, data.custbirth, data.gustScore); // Affichez le menu de premier niveau, c'est-à-dire le menu d'interface de connexion.showloginmenu (); // Cet drapeau est utilisé pour déterminer si une erreur de fonctionnement du système s'est produite. Lorsque l'opération est incorrecte, l'indicateur est faux, afin de quitter le système. La valeur par défaut n'est pas une erreur booléen drapeau = true; // Traitement de l'ensemble du processus système DO {// Une erreur de fonctionnement se produit, quittez le système si (! Flag) Break; // Créer un objet qui vérifie si l'utilisateur connecté dans le compte et le mot de passe est correct. Seuls les objets sont créés ici et la méthode de vérification VerifyEqual n'est pas exécutée. VerifyEqual = new VerifyEqual (); // Entrez la sélection dans le scanner de scanner de menu de premier niveau = nouveau scanner (System.in); int i = scanner.nextint (); // Faire différentes réponses à la sélection du menu de premier niveau. Notez qu'il s'agit du commutateur d'utilisation de cas de commutateur classique (i) {cas 1: // L'utilisateur sélectionne "Système de connexion" // Définir un compteur, ce qui signifie que l'utilisateur ne peut essayer que 3 fois au maximum, et quitter directement le système avec 3 erreurs d'entrée int j = 3; // Traitement du traitement pour la connexion au système Do {if (VerifyEqual.Verify (data.manager.userName, data.manager.password)) {// l'utilisateur connecté avec succès et le menu d'achat de deuxième niveau s'affiche! ! ! menu.showmainMenu (); casser; } if (j! = 1) {// L'entrée utilisateur est incorrecte et n'a pas atteint 3 fois. Renforcez System.out.println ("/ n le nom d'utilisateur et le mot de passe ne correspondent pas, veuillez vous réintégrer:"); } else {// Les 3 tentatives se terminent, définissent l'indicateur de sortie et quittent le System Do-While Loop.out.println ("/ nyou n'ont pas la permission d'entrer dans le système! Merci!"); Flag = false; casser; } // décrément le compteur par 1 chaque fois que vous entrez pour indiquer combien de fois j--; } while (true); casser; Cas 2: // L'utilisateur sélectionne "Modifier les informations de l'administrateur" if (VerifyEqual.Verify (data.manager.username, data.manager.password)) {// Avant d'entrer de nouvelles informations, vous devez vérifier les informations d'origine. Cela signifie que la vérification a réussi. System.out.print ("Veuillez saisir le nouveau nom d'utilisateur:"); data.manager.userName = Scanner.Next (); System.out.print ("Veuillez saisir le nouveau mot de passe:"); data.Manager.Password = Scanner.Next (); System.out.println ("Le nom d'utilisateur et le mot de passe ont été modifiés!"); // Les informations ont été modifiées avec succès. Sélectionnez le prochain Operation System.out.println ("/ nplease sélectionnez, entrez le numéro:"); } else {// La vérification des informations a échoué, définissez l'indicateur de sortie System.out.println ("Désolé, vous n'avez pas la permission de le modifier!"); Flag = false; } casser; Cas 3: // L'utilisateur sélectionne "Exit" System.out.println ("Merci pour votre utilisation!"); System.exit (0); casser; par défaut: // L'entrée de menu de premier niveau est incorrecte, et vous devez resélectionner System.out.print ("/ n l'entrée est incorrecte! Veuillez sélectionner à nouveau et entrez le numéro:"); casser; }} while (drapeau); }}3.2 Classe de données
package cn.itcast; / ** * La classe de données qui stocke les données d'initialisation du système d'achat. Cette classe stocke uniquement les informations sur les produits et les informations du client existantes * * @author * * / public class data {/ ** * Le constructeur par défaut, initialise les variables. Étant donné que ce sont tous des objets de tableau ou des objets de classe, ils doivent tous utiliser de nouvelles données * * / publics () {bourse = new String [50]; GoodsPrice = nouveau double [50]; Custno = new int [100]; Custbirth = nouvelle chaîne [100]; CustScore = new int [100]; manager = new manager (); } / ** * Initialiser les données de cette classe * * / public void initial () { / * ===================================================================. =====================================================. bourse de bien [0] = "Sneakers Addidas"; GoodsPrice [0] = 880D; bourse de marchandises [1] = "jupe de tennis kappa"; GoodsPrice [1] = 200D; bourse de marchandises [2] = "raquette supérieure"; GoodsPrice [2] = 780D; bourse bourse [3] = "T-shirt Addidas"; GoodsPrice [3] = 420.7799999999999997D; GoodsName [4] = "Sneakers Nike"; GoodsPrice [4] = 900D; bourse [5] = "Tennis kappa"; GoodsPrice [5] = 45d; bourse [6] = "kappat-shirt"; GoodsPrice [6] = 245D; / * ======================================================================================================================. ========================================================================================================================. ========================================================================================================================. ========================================================================================================================. Custno [1] = 1711; Custbirth [1] = "07/13"; CustScore [1] = 4000; Custno [2] = 1623; Custbirth [2] = "06/26"; CustScore [2] = 5000; Custno [3] = 1545; Custbirth [3] = "04/08"; CustScore [3] = 2200; Custno [4] = 1464; Custbirth [4] = "08/16"; CustScore [4] = 1000; Custno [5] = 1372; Custbirth [5] = "12/23"; CustScore [5] = 3000; Custno [6] = 1286; Custbirth [6] = "12/21"; CustScore [6] = 10080; } / * ==========================================================================================================. ============================================================================================================. ============================================================================================================. ============================================================================================================. Anniversaire du client public int CustScore []; // Points du client Gestionnaire public Manager; // Classe d'administrateur, uniquement le nom d'utilisateur et le mot de passe de l'administrateur}3.3 Classe de gestionnaire
package cn.itcast; / ** * Classe d'administrateur, stocke uniquement le nom d'utilisateur et le mot de passe de l'administrateur * * @author * * / Gestionnaire de classe publique {/ ** * Définissez le nom d'utilisateur et le mot de passe par défaut * * / public Manager () {username = "itast"; mot de passe = "itcast"; } / * ================================== Définir les variables appartenant à ce class============================================================================================= =======================================================================================================================. =======================================================================================================================. ========================================================================================================================.3.4 Classe de vérification
package cn.itcast; import java.util.scanner; / ** * classe qui vérifie si l'utilisateur connecté est correct * * @Author * * / public class VerifyEqual {/ ** * Constructeur vide * * / public VerifyEqual () {} / ** * Méthode pour effectuer la vérification * * @param s le nom d'utilisateur correct pour la vérification * @param s le mot de passe correct pour la vérification * @return * / le public Boolel nom d'utilisateur System.out.print ("Veuillez entrer le nom d'utilisateur:"); Scanner Scanner = nouveau scanner (System.in); String S2 = Scanner.Next (); // Entrez le mot de passe de l'utilisateur System.out.print ("Veuillez saisir le mot de passe:"); scanner = nouveau scanner (System.in); String S3 = Scanner.Next (); // Déterminez si les informations saisies par l'utilisateur sont conformes aux informations existantes Retour S2.equals (S) && S1.Equals (S3); }}3.5 Classe de menu
package cn.itcast; import java.util.scanner; / ** * Classe de menu, utilisé pour afficher tous les niveaux de menus pour la sélection des utilisateurs * * @Author * * / classe publique Menu {/ ** * Constructeur vide * * Menu public () {} / ** * Définir les informations de données dans la classe de menu * * @param as * @param ad * @param ai * @param ai * @param ai * @param ai * @param ai1 * / public Void Setdat. Double ad [], int Ai [], String AS1 [], int Ai1 []) {bourse) comme; GoodsPrice = AD; Custno = ai; Custbirth = AS1; CustScore = Ai1; } / ** * Affichez le menu de premier niveau, c'est-à-dire l'interface de connexion * * / public void showLoginMenu () {System.out.println ("/ n / n / t / t / t / t bienvenue sur le système de gestion du shopping iTast 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. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /** * Display the secondary menu, that is, the main menu of the Système. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Customer Information Management / n "); System.out.println (" / t / t / t / t 2. Settlement shopping / n "); System.out.println (" / t / t / t / t 3. Trait / n "); System.out.Println (" / T / T / T / T / T 4. Logout/n"); System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * L'utilisateur sélectionne le scanner du service. Contrôler la boucle booléenne = false; Classe de règlement d'achat et gère l'intégralité du processus de règlement des achats Pay = New Pay (); Sélectionne "Connexion" if (S.Equals (4 ")) {// Affiche le menu de premier niveau, et il revient au Film de traitement de premier niveau dans la classe STARDSM Gestion de l'information * * / public void showCustMmeNu () {System.out.println ("Système de gestion des achats> Gestion des informations client / n"); * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * System.out.println ("/ t / t / t / t 2. Ajouter des informations client / n"); * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *? Données, les données sont toujours les données d'origine. Informations client "if (s.equals (" 2 ")) {CustManagement.Add (); Break;} // Customer SELECT" Modifier les informations du client "if (s.equals (" 3 ")) {Custmanagement.Modify (); Break;} // Client SELECT" Query Informations client "if (s.equals (" 4 ")) {menu Custmanagement.Search (); Break;}. (S.Equals (n ")) {ShowMainMenu (); feedback/n"); System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Lucky Broadcast / n "); System.out.Printl Lottery/n"); System.out.println("/t/t/t/t/t 3. Birthday greeting/n"); System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * (S.Equals (1 ")) {GiftManing.SendGoldEnCT (); "Retour au menu précédent" if (s.equals ("n") {showMainMenu (); / * ===============================================================================================. CustNo [];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 = false; } 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; casser; } 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; casser; } 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; retour 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 = false; } 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 = ""; booléen drapeau = false; 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 = true; } // 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 = ""; booléen drapeau = false; 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 = true; } } // 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(); } /*================================================================================================================= ==================================================================================================================== =================================================================================================================== ==================================================================================================================== 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=================================================================================== ==============================================================================================================. ==============================================================================================================. ==============================================================================================================. // Gift name public double price; // Gift price}3.10 代码总结
从上面的9个类的代码来看,有一些需要注意的地方:
(1)在许多类中都定义了与Data中基本一样的成员变量,只是没有Manager对象而已,这是为了让数据一层层保存和传递,通过setData()方法实现,不过这种方法其实并不是很好,并且一般来说成员变量应该最好设置为私有的,这里这样的设计是为了操作方便,使系统更简单一些,安全性不好。
(2)注意到所有要进行字符串拼接的地方都使用JAVA中的StringBuilder类,这是为了高效处理字符串拼接,防止String类带来的拼接数据冗余。
(3)这些设计中的流程并不是非常合理,大家可以自己的需要进行修改。
(4)代码中基本上没有考虑异常时的处理,所以当输入时出现错误的时候,普通错误可以进行重新输入,但是如果出现不匹配等错误,直接会出现异常,从而退出系统,这些也是本设计的缺陷,可以通过正则表达式等来完善一些。
总之,给出的代码仅供参考,大家可以根据需要进行修改,这些代码都是经过验证的,可以直接运行。
4. Résumé
这个设计只是为了说明一些基本的设计思想和设计理念,以及设计过程中需要考虑的问题,主要还是为了说明怎样用面向对象的思想去解决现实生活中的问题,所以设计相对简单,不过希望大家可以通过这个设计理解这些基本的思想,从而帮助大家理想面向对象的基本思想。
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. Merci.