Los ejemplos en este artículo comparten el diseño y el código de implementación del sistema de compras Java para su referencia. El contenido específico es el siguiente
1. Análisis de requisitos y clasificación del sistema de compras
El sistema de compras en sí es un sistema muy complejo, con muchos detalles y problemas que serán más complicados si los estudia profundamente. Además, el sistema de compras general es el tipo de página web y necesita tener una interfaz amigable. Sin embargo, como un proyecto simple, este proyecto es solo introducir las ideas básicas de desarrollo a los principiantes de Java y cómo diseñar marcos y procesos de implementación cuando se orientan a los objetos. Por lo tanto, es solo un proyecto simple desarrollado basado en Eclipse, sin la participación de la GUI, y muchos detalles y problemas se utilizan como investigación de seguimiento. El diseño general es relativamente simple, pero es suficiente para explicar muchas ideas de diseño y conceptos de diseño. Entonces, las necesidades básicas se analizan a continuación.
Como un sistema de compras simple, debe tener al menos las siguientes funciones (estas funciones se distribuyen en diferentes niveles de menús):
(1) función de inicio de sesión de usuario y función de modificación de contraseña de cuenta de usuario, la función de registro no está disponible por el momento;
(2) Después de que el usuario inicie sesión con éxito, necesita tener la función de gestión de la información del cliente, la función de liquidación de compras y algunas actividades de lotería;
(3) Hay muchas funciones que se pueden dividir debajo de la función de gestión de la información del cliente, como: consulta, modificación, adición, etc.;
(4) Hay muchas funciones que se pueden dividir debajo de la función de liquidación de compras, como: selección de productos, pago, facturación, etc.;
(5) Se pueden diseñar varias formas de lotería bajo la lotería, que se puede dividir en muchos nuevos módulos funcionales.
(6) La función de salir del sistema debe proporcionarse en el menú de primer nivel, la función de iniciar sesión fuera del menú de segundo nivel debe proporcionarse en el menú de segundo nivel, y otros menús deberían poder volver al menú anterior.
Las funciones anteriores son todas las funciones relativamente básicas. Si diseña de acuerdo con la idea orientada al proceso, dividirá muchos módulos funcionales y luego seguirá el proceso paso a paso. Pero ahora usamos la idea orientada a objetos para diseñar, ¿cómo debemos considerar el marco de diseño? La idea principal de los objetos es abstraer algunos requisitos en muchas clases y luego establecer conexiones entre estas clases. A través de la cooperación colaborativa entre diferentes clases, se pueden lograr todas las funciones. Por lo tanto, la tarea principal ahora es cómo abstraer razonablemente estas clases, ¿qué funciones van a implementar estas clases y cuáles son las conexiones entre las clases? El siguiente es un análisis de este proceso basado en la estructura de este diseño.
(1) Clase de inicio: utilizado para el inicio del sistema. Nuestro sistema definitivamente necesita una clase de inicio. Esta clase contiene el método principal para iniciar el sistema. Esta clase está en el nivel superior, por lo que no puede involucrar demasiados detalles subyacentes. Solo necesita implementar algunos procesos básicos de nivel superior. Lo principal es llamar a algunos métodos de otras clases subyacentes para implementar funciones.
(2) Clase de datos: se utiliza para almacenar toda nuestra información de datos. Este diseño almacena principalmente información previa al producto para la compra y la información registrada de los miembros. ¿Por qué necesitas esta clase? Piénselo, en un diseño orientado a objetos, tenemos muchos datos, y no debemos definirlo y modificarlo dispersamente en todas partes. Esto hará que la agregación del sistema sea demasiado baja, propensa a muchos errores, y es difícil realizar la expansión de la función posterior y la modificación de errores. Por lo tanto, necesitamos clasificar algunos de los datos públicos utilizados, luego ponerlos en una clase y proporcionar métodos para operar estos datos en esta clase.
(3) Clase de menú: se usa para mostrar y procesar menús en todos los niveles. Dado que estamos diseñando un sistema de compras, incluso si es simple, necesitamos un menú básico para interactuar con los usuarios. Dado que hay muchos menús y los menús en cada nivel están conectados capa por capa, necesitamos manejar los menús de manera uniforme, por lo que aparece la categoría de menú. Tenga en cuenta que el menú aquí es solo algunas pantallas de menú de nivel superior y llamadas de funciones básicas. El algoritmo subyacente específico aún debe ser implementado por clases más subyacentes.
(4) Clase de administrador: se usa para almacenar la cuenta y la contraseña del usuario. Dado que necesitamos que los usuarios inicien sesión, definitivamente debemos necesitar una clase separada para administrar la cuenta y la contraseña del usuario, para que el sistema sea más independiente. El usuario diseñado esta vez tiene solo una cuenta y contraseña, y solo se permite realizar cambios en la cuenta y la contraseña, pero el registro no está permitido.
(5) Verifye -Equal Clase: Se utiliza para verificar la información de inicio de sesión. Esta clase es equivalente a abstraer la función de inicio de sesión en una clase. Esta implementación en realidad no es muy necesaria, pero para que la división de funciones del sistema sea más clara, esta clase está diseñada para verificar la información de inicio de sesión y las cuentas y contraseñas existentes, dando así el resultado de verificación.
(6) Clase de custmanagement: utilizado para la gestión de la información del cliente. Esta clase implementa algunas funciones subyacentes, como consulta, modificación, adición, etc. Cuando ingresamos el menú de gestión de información del cliente, debemos realizar muchas operaciones sobre la información del cliente. Para facilitar la gestión de estas operaciones y tener en cuenta la expansión posterior, todas las funciones de la gestión de la información del cliente se abstraen aquí y se colocan en esta categoría. El menú anterior se da cuenta de la gestión de la información del cliente llamando a los métodos de esta clase.
(7) Clase de pago: se usa para manejar las operaciones de compras y pago. El principio de esta clase es básicamente el mismo que la clase anterior. Cuando un cliente elige comprar, debe haber muchas operaciones, como qué comprar, cuánto dinero, pago, cambio, etc. Estas funciones están relativamente fragmentadas, por lo que las administramos centralmente, abstraer esta clase e implementar el algoritmo subyacente para las opciones de menú para compras y asentamientos. El menú anterior se da cuenta de las funciones de compras y liquidación llamando al método de esta clase y puede volver al menú anterior.
(8) Clase de gestión de regalos: funciones relacionadas utilizadas para manejar actividades de lotería. Las razones de la existencia de esta clase son básicamente las mismas que las de (6) y (7). Esta clase administra uniformemente las actividades de lotería. El menú anterior solo necesita llamar al método de esta clase para realizar la función de lotería.
(9) Clase de regalo: se usa para administrar regalos. Dado que la sesión de lotería está diseñada, definitivamente se necesitan regalos. Entonces, ¿qué tipo de regalos daremos? No podemos enumerar cada regalo en detalle. Esto es muy redundante y problemático, por lo que simplemente abstraimos una clase de regalo y guardamos algunos atributos del regalo: el nombre y el precio del regalo en las variables de los miembros de la clase. Entonces podemos administrar fácilmente la clase. Si se necesita el regalo, cree un nuevo objeto de regalo directamente y luego modifique y administre los atributos del objeto. Esta implementación es similar a una interfaz, pero es completamente diferente de la interfaz y tiene funciones similares.
En resumen, las clases anteriores se abstraen después de dividirse en algunos módulos funcionales, y algunos lugares no son necesariamente razonables. Principalmente necesitan analizar los requisitos y formular diferentes planes de acuerdo con diferentes necesidades. Aquí, quiero enfatizar nuevamente la "clase de regalo". El diseño de esta clase es muy consistente con la idea orientada a objetos. Por ejemplo, si se necesitan muchos obsequios en el sistema de compras, como teléfonos móviles, computadoras, fuentes de alimentación móviles, etc., entonces si escribimos estos regalos uno por uno, el código del sistema será muy redundante. Debido a que los atributos de los regalos son básicamente los mismos, podemos abstraerlos en una clase, para que solo podamos definir un objeto cuando necesitemos un regalo y luego dar ciertos atributos. Por ejemplo, si necesitamos un teléfono o computadora móvil, solo necesitamos un nuevo objeto de clase de regalo, y luego establecer sus atributos en un teléfono móvil cuando necesitamos un teléfono móvil, establecer sus atributos en una computadora cuando necesitamos una computadora y configurar lo que necesitemos. Esto hace que nuestro código se simplifique y la estructura sea más clara. En sistemas más complejos, en realidad es más razonable utilizar una interfaz para implementar regalos, de modo que se puedan implementar diferentes categorías de regalos de acuerdo con la interfaz, satisfaciendo así diferentes necesidades. Es similar a la interfaz USB en nuestra computadora. Con esta interfaz, podemos conectar muchos dispositivos periféricos diversos, y la verdad es similar.
2. La relación y el proceso entre clases en el sistema de compras (denotado en forma gráfica)
La siguiente figura muestra la relación entre estas 9 clases que utilicé la herramienta de dibujo Microsoft Office Visio 2003.
De la figura anterior, podemos ver claramente la relación entre varios tipos. La relación y el proceso general son los siguientes:
(1) La clase de inicio es una clase de inicio, que contiene el método principal. Esta clase define objetos de la clase y clase de datos Verify -Equal para almacenar datos y información de verificación. Al mismo tiempo, la clase de datos contiene la clase de administrador para almacenar información de cuenta de usuario pre-almacenada. Luego, a través de cierta lógica en el método principal, se llama al método showloginmenu () en la clase de menú para procesar el menú de primer nivel: proceso de modificación de registro;
(2) Si el inicio de sesión es exitoso, llame al método showmainmenu () en la clase de menú para manejar el proceso principal del menú de segundo nivel: el sistema de compras. Si el inicio de sesión falla 3 veces, saldrá directamente del sistema;
(3) En el método showmainmenu () en la clase de menú, al seleccionar diferentes opciones de menú secundarias, se llama al método showcustmmenu () en la clase de menú para manejar el proceso de gestión de información del cliente o para llamar al método shoSendMenu () en la clase de menú para manejar el proceso de lotería o llamar al método calcprice () en la clase de pago para manejar el proceso de asentamiento de compras;
(4) Si se selecciona la opción de gestión de información del cliente en el menú secundario, se llamará al método showcustmmenu () en la clase de menú. Este método llamará a varios métodos en la clase CustManagement para manejar diferentes operaciones en la gestión de la información del cliente;
(5) Si se selecciona la opción de asentamiento de compras en el menú secundario, se llamará al método CalcPrice () en la clase de pago para manejar el proceso de liquidación de compras. Tenga en cuenta que el método getDiscount () en la clase de pago se utiliza para calcular la tasa de descuento según la información del miembro del cliente;
(6) Si se selecciona la opción de retroalimentación sincera en el menú secundario, es decir, la lotería, entonces se llamará al método showsendmenu () en la clase de menú. Este método llamará a varios métodos en la clase de administración de regalos para manejar diferentes operaciones de la lotería;
Tenga en cuenta que hay un método ReturnLastMenu () en la clase CustManagement y la clase de GiftManagement, que se utiliza para volver al menú anterior.
3. Implementación del código
Una cosa a tener en cuenta es que estos códigos deben colocarse en el paquete CN.itcast.
3.1 Clase de inicio
paquete cn.itcast; import java.util.scanner; / ** * Esta clase es la clase de método principal de este sistema, utilizado para iniciar el sistema de compras * * @author * */ public class startms {/ ** * vacía constructor * */ public startsms () {}/ ** * System Main Method * * @param información */ Public static void main (string args []) {// Cree un objeto de la clase de datos existente e inicialize la información existente de la información de productos existentes y los datos de los datos de los datos existentes y los datos de los datos de los datos existentes (los datos de los datos de los datos (); data.initial (); // Crear un objeto del menú de clase de menú menú = nuevo menú (); // Aquí la información de datos existente inicializada se envía al objeto de menú Menu.setData (data.goodsname, data.goodsprice, data.custno, data.custbirth, data.custscore); // Muestra el menú de primer nivel, es decir, el menú de la interfaz de inicio de sesión.showloginmenu (); // Este indicador se utiliza para determinar si se ha producido un error de operación del sistema. Cuando la operación es incorrecta, el indicador es falso, para salir del sistema. El valor predeterminado es sin error Boolean Flag = True; // procesar todo el proceso del sistema do {// se produce un error de operación, salga del sistema if (! Flag) break; // Cree un objeto que verifique si el usuario inició sesión en la cuenta y la contraseña es correcto. Solo se crean objetos aquí, y el método de verificación VerifyEqual no se ejecuta. verifyequal = new VerifyEqual (); // Ingrese la selección en el escáner de escáner de menú de primer nivel = new Scanner (System.in); int i = scanner.nextInt (); // hacer diferentes respuestas a la selección del menú de primer nivel. Tenga en cuenta que este es el interruptor de uso de Case Classic (I) {Case 1: // El usuario selecciona "Sistema de inicio de sesión" // Defina un contador, lo que significa que el usuario solo puede intentar 3 veces como máximo, y salir directamente del sistema con 3 errores de entrada int j = 3; // Proceso de procesamiento para iniciar sesión en el sistema DO {if (verifyEqual.verify (data.manager.username, data.manager.password)) {// El usuario inició sesión con éxito y se muestra el menú de compras de segundo nivel. ! ! menú.showmainmenu (); romper; } if (j! = 1) {// La entrada del usuario es incorrecta y no ha alcanzado 3 veces. Reenter System.out.println ("/N El nombre de usuario y la contraseña no coinciden, por favor vuelva a ingresar:"); } else {// Los 3 intentos finalizan, establezcan el indicador de salida y salga del bucle do-while system.out.println ("/nyou no tiene permiso para ingresar al sistema! ¡Gracias!"); bandera = falso; romper; } // disminuye el contador por 1 cada vez que entra para indicar cuántas veces J--; } while (verdadero); romper; Caso 2: // El usuario selecciona "Cambiar información del administrador" if (VerifyEqual.verify (data.manager.username, data.manager.password)) {// Antes de ingresar nueva información, debe verificar la información original. Esto significa que la verificación ha sido exitosa. System.out.print ("Ingrese el nuevo nombre de usuario:"); data.manager.username = scanner.next (); System.out.print ("Ingrese la nueva contraseña:"); data.manager.password = scanner.next (); System.out.println ("¡Se han cambiado el nombre de usuario y la contraseña!"); // La información se ha cambiado con éxito. Seleccione la siguiente operación System.out.println ("/nlease select, ingrese el número:"); } else {// La verificación de la información falló, establezca el indicador de salida System.out.println ("Lo siento, no tiene permiso para modificarlo!"); bandera = falso; } romper; Caso 3: // El usuario selecciona "Salir" System.out.println ("¡Gracias por su uso!"); System.exit (0); romper; Valor predeterminado: // La entrada del menú de primer nivel es incorrecta, y debe volver a seleccionar System.out.print ("/N La entrada es incorrecta! Seleccione nuevamente e ingrese el número:"); romper; }} while (bandera); }}3.2 Clase de datos
paquete cn.itcast; /*** La clase de datos que almacena los datos de inicialización del sistema de compras. Esta clase solo almacena la información del producto existente y la información del cliente * * @author * * / public class data { / ** * El constructor predeterminado, inicializando variables. Dado que todos son objetos de matriz o objetos de clase, todos necesitan usar nuevos * */ public data () {GoodsName = new String [50]; GoodsPrice = nuevo doble [50]; custno = new int [100]; custbirth = nueva cadena [100]; custscore = new int [100]; gerente = nuevo gerente (); } / *** Inicializa los datos de esta clase** / public void inicial () { /*=========================================================== ============================================================/ GoodsName [0] = "Sneakers Addidas"; GoodsPrice [0] = 880d; GoodsName [1] = "Kappa Tennis Skirt"; GoodsPrice [1] = 200D; Goodsname [2] = "Top Racket"; GoodsPrice [2] = 780d; GoodsName [3] = "Camiseta Addidas"; BETSPRICE [3] = 420.7799999999999997D; GoodsName [4] = "Nike Sneakers"; GoodsPrice [4] = 900D; GoodsName [5] = "Kappa Tennis"; GoodsPrice [5] = 45d; GoodsName [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; } /*================================================================================================================================================================================. =========================================================================================================== =========================================================================================================== =========================================================================================================== CUMPLEAÑOS DEL CLIENTE Public int custscore []; // Puntos del cliente Gerente de Gerente Público; // clase administradora, solo el nombre de usuario y la contraseña del administrador}3.3 Clase de gerente
paquete cn.itcast; / ** * Clase de administrador, solo almacena el nombre de usuario y la contraseña del administrador * * * @author * */ public class Manager {/ ** * Establezca el nombre de usuario y la contraseña predeterminados * */ public manager () {username = "itcast"; contraseña = "itcast"; } /*=================================== Defina las variables propiedad de esto clase ========================================================================================================================================================== ====================================================================================================================================================================== ¡ ====================================================================================================================================================================== ¡ ================================================================================================================================================================================= ¡3.4 VERIFY -EQUAL CLASE
paquete cn.itcast; import java.util.scanner; / *** clase que verifica si el usuario iniciado es correcto** @author**/ public class VerifyEqual {/ *** Vachous Constructor**/ public VerifyEqual () {}/ *** Método para realizar Verificación*** @Param s El nombre de usuario correcto* @Param S la contraseña correcta para verificar* @Counturn*/ public boolean verifica (string s1 s1) Nombre de usuario System.out.print ("Ingrese el nombre de usuario:"); Scanner Scanner = New Scanner (System.in); Cadena s2 = scanner.next (); // Ingrese la contraseña desde el usuario System.out.print ("Ingrese la contraseña:"); Scanner = New Scanner (System.in); Cadena s3 = scanner.next (); // Determinar si la información ingresada por el usuario es consistente con la devolución de información existente S2.Equals (S) && S1.Equals (S3); }}3.5 Clase de menú
paquete cn.itcast; import java.util.scanner; / ** * clase de menú, utilizada para mostrar todos los niveles de menús para la selección de usuarios * * @author * */ public class menú {/ ** * Constructor vacío * */ Menú público () {}/ ** * Establecer información de datos en la clase de menú * * @param as * @param ad * @param ai * @param ai * @param ai * @param ai * @param ai1 */ public void void (string (strike AS [String (String AS [String AS [DIFET (STRING (STRIFE (STRING AL DISHA (STRING AS [DIS doble ad [], int ai [], string as1 [], int ai1 []) {GoodsName = as; GoodsPrice = AD; custno = ai; custbirth = as1; custscore = ai1; }/*** Muestre el menú de primer nivel, es decir, la interfaz de inicio de sesión**/public void showloginmenu () {system.out.println ("/n/n/t/t/t/t bienvenido al sistema de gestión de compras itcast versión 1.0/n/n"); System.out.Println ("" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *) System.out.println ("/t/t/t/t/t 3. EXIT/N/N"); * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ... * * * * * * * * * * * * * * * *) Sistema. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Gestión de información del cliente/n "); system.out.println ("/t/t/t/t/t 2. Shopping Settlement/n "); System.out.Println ("/t/t/t/t 3. Verdad verdadero/n "); System.Println ("/"/T/t/t 4. Logout/n"); System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *) Control de la bandera booleana = false; Clase de liquidación y maneja el proceso de presentación de compra total = nuevo Pay (); if (s.equals ("4")) {// muestra el menú de primer nivel, y volverá al flujo de procesamiento de menú de primer nivel en la clase de inicio showLoginMenu () showcustmmenu () {system.out.println ("Sistema de gestión de compras> Gestión de información del cliente/n"); * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ... * * * * System.out.println ("/t/t/t/t 2. Agregar información del cliente/n"); * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *) Datos originales. CustManagement.Add (); break; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *) System.out.println ("/t/t/t/t/t 3. Saludos de cumpleaños/n"); * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Queater soldan * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *) Scanner (System.in); GiftManagement.sendGoldencust (); (S.Equals ("N") {ShowmainMenu (); /*====================================================================================*/ Cadena pública Nombre []; [];3.6 Clase de 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: "); bandera = falso; } 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; romper; } 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; romper; } 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; regresar 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: "); bandera = falso; } 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 = ""; bandera booleana = falso; 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(); bandera = verdadero; } // 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 = ""; bandera booleana = falso; 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(); bandera = verdadero; } } // 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; /** * 用来存放真情回馈中的礼物的类*/ public class Gift { /** * 空构造方法* */ public Gift() { } /** * 根据礼物对象的变量返回礼物的全部信息* */ public String toString() { return (new StringBuilder()).append("一个价值¥").append(price) .append("的").append(name).toString(); } /*====================定义该类所拥有的变量====================*/ public String name ; // 礼物名字public double price; // 礼物价格}3.10 代码总结
从上面的9个类的代码来看,有一些需要注意的地方:
(1)在许多类中都定义了与Data中基本一样的成员变量,只是没有Manager对象而已,这是为了让数据一层层保存和传递,通过setData()方法实现,不过这种方法其实并不是很好,并且一般来说成员变量应该最好设置为私有的,这里这样的设计是为了操作方便,使系统更简单一些,安全性不好。
(2)注意到所有要进行字符串拼接的地方都使用JAVA中的StringBuilder类,这是为了高效处理字符串拼接,防止String类带来的拼接数据冗余。
(3)这些设计中的流程并不是非常合理,大家可以自己的需要进行修改。
(4)代码中基本上没有考虑异常时的处理,所以当输入时出现错误的时候,普通错误可以进行重新输入,但是如果出现不匹配等错误,直接会出现异常,从而退出系统,这些也是本设计的缺陷,可以通过正则表达式等来完善一些。
总之,给出的代码仅供参考,大家可以根据需要进行修改,这些代码都是经过验证的,可以直接运行。
4. Resumen
这个设计只是为了说明一些基本的设计思想和设计理念,以及设计过程中需要考虑的问题,主要还是为了说明怎样用面向对象的思想去解决现实生活中的问题,所以设计相对简单,不过希望大家可以通过这个设计理解这些基本的思想,从而帮助大家理想面向对象的基本思想。
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. Gracias.