软件结构设计
CustomerView为主模块,负责菜单的显示和处理用户操作
CustomerList为Customer对象的管理模块,内部用数组管理一组Customer对象,并提供相应的添加、修改、删除和遍历方法,供CustomerView调用
Customer为实体对象,用来封装客户信息
工具类CMUtility
import java.util.Scanner; /** CMUtility工具类: 将不同的功能封装为方法,就是可以直接通过调用方法使用它的功能,而无需考虑具体的功能实现细节。 */ public class CMUtility{ private static Scanner scanner = new Scanner(System.in); /** 用于界面菜单的选择。该方法读取键盘,如果用户键入’1’-’5’中的任意字符,则方法返回。返回值为用户键入字符。 */ public static char readMenuSelection() { char c; for (; ; ) { String str = readKeyBoard(1, false); c = str.charAt(0); if (c != '1' && c != '2' && c != '3' && c != '4' && c != '5') { System.out.print("选择错误,请重新输入:"); } else break; } return c; } /** 从键盘读取一个字符,并将其作为方法的返回值。 */ public static char readChar() { String str = readKeyBoard(1, false); return str.charAt(0); } /** 从键盘读取一个字符,并将其作为方法的返回值。 如果用户不输入字符而直接回车,方法将以defaultValue 作为返回值。 */ public static char readChar(char defaultValue) { String str = readKeyBoard(1, true); return (str.length() == 0) ? defaultValue : str.charAt(0); } /** 从键盘读取一个长度不超过2位的整数,并将其作为方法的返回值。 */ public static int readInt() { int n; for (; ; ) { String str = readKeyBoard(2, false); try { n = Integer.parseInt(str); break; } catch (NumberFormatException e) { System.out.print("数字输入错误,请重新输入:"); } } return n; } /** 从键盘读取一个长度不超过2位的整数,并将其作为方法的返回值。 如果用户不输入字符而直接回车,方法将以defaultValue 作为返回值。 */ public static int readInt(int defaultValue) { int n; for (; ; ) { String str = readKeyBoard(2, true); if (str.equals("")) { return defaultValue; } try { n = Integer.parseInt(str); break; } catch (NumberFormatException e) { System.out.print("数字输入错误,请重新输入:"); } } return n; } /** 从键盘读取一个长度不超过limit的字符串,并将其作为方法的返回值。 */ public static String readString(int limit) { return readKeyBoard(limit, false); } /** 从键盘读取一个长度不超过limit的字符串,并将其作为方法的返回值。 如果用户不输入字符而直接回车,方法将以defaultValue 作为返回值。 */ public static String readString(int limit, String defaultValue) { String str = readKeyBoard(limit, true); return str.equals("")? defaultValue : str; } /** 用于确认选择的输入。该方法从键盘读取‘Y’或’N’,并将其作为方法的返回值。 */ public static char readConfirmSelection() { char c; for (; ; ) { String str = readKeyBoard(1, false).toUpperCase(); c = str.charAt(0); if (c == 'Y' || c == 'N') { break; } else { System.out.print("选择错误,请重新输入:"); } } return c; } private static String readKeyBoard(int limit, boolean blankReturn) { String line = ""; while (scanner.hasNextLine()) { line = scanner.nextLine(); if (line.length() == 0) { if (blankReturn) return line; else continue; } if (line.length() < 1 || line.length() > limit) { System.out.print("输入长度(不大于" + limit + ")错误,请重新输入:"); continue; } break; } return line; } }
客户类Customer
public class Customer{ //客户基本属性(私有化) 解释:在私有化之后就不能利用类名.属性来访问该属性了,只有调用该类的public对应的方法才能对对象的属性值进行修改----这体现了封装性 private String name;//名字 private String sex;//性别 private int age;//年龄 private String phone;//电话 private String email;//电子邮箱 //多参构造器。 作用:在声明客户对象的时候直接对属性赋值 public Customer(String name,String sex,int age,String phone,String email){ //this指的是本对象 this.name=name; this.sex=sex; this.age=age; this.phone=phone; this.email=email; } //下面就是get和set方法来对对应的对象的属性值进行修改和获取 public void setName(String name){ this.name=name; } public String getName(){ return this.name; } public void setSex(String sex){ this.sex=sex; } public String getSex(){ return this.sex; } public void setAge(int age){ this.age=age; } public int getAge(){ return this.age; } public void setPhone(String phone){ this.phone=phone; } public String getPhone(){ return this.phone; } public void setEmail(String email){ this.email=email; } public String getEmail(){ return this.email; } //重写toString方法,在打印对象的时候,不会是输出地址值,而是会输出该对象对应的属性 public String toString(){ return("姓名:"+this.name+"\t性别:"+this.sex+"\t年龄:"+this.age+"\t电话号码:"+this.phone+"\t电子邮件:"+this.email); } }
存储客户链表类
//存储对象类 public class CustomerList{ //利用数组存储对象 Customer[] customers; //设置链表大小 int size=0; //构造器 public CustomerList(int totalCustomer){ customers=new Customer[totalCustomer]; } //添加客户 public boolean addCustomer(Customer c){ //判断有没有满 if(size==customers.length){ return false; //没有满就将对象加入链表中 }else{ customers[size]=c; //链表大小+1 size++; } return true; } //修改客户,利用客户所在编号 public boolean replaceCustomer(int index,Customer cust){ //判断编号是否合法,也就是有没有这个客户 if(index>=size){ return false; }else{ //由于客户编号和实际存储位置的关系是客户编号-1==实际存储位置,所以存储时候index-1 customers[index-1]=cust; return true; } } //删除客户 public boolean deleteCustomer(int index){ //判断客户编号是否合法 if(index>=size){ return false; }else{ //由于是利用数组进行存储,所有在删除的时候需要将客户后面的客户前移一位 for(int i=index;i<size;i++){ customers[i]=customers[i+1]; } //链表大小减一 size--; return true; } } //获取所有客户信息 public Customer[] getAllCustomers(){ //遍历存储数组 for(int i=0;i<size;i++){ //由于Customer重写了toString方法,所有在打印Customer对象的时候调用的是重写的方法 System.out.println("编号:"+(i+1)+" "+customers[i]); } return customers; } //获取某个客户信息 public Customer getCustomer(int index){ //直接返回数组对象 return customers[index-1]; } //获取一共存储了多少对象 public int getTotal(){ return size; } }
主模块
显示用户操作
public class Customerview{ //空参构造器 public Customerview(){ } //主菜单 public void enterMainMenu(){ System.out.println("***************客户信息管理软件***************\n"); System.out.println(" 1 添加客户"); System.out.println(" 2 修改客户"); System.out.println(" 3 删除客户"); System.out.println(" 4 客户列表"); System.out.println(" 5 退 出\n"); System.out.print(" 请选择(1-5):"); } //添加客户菜单 public void addNewCustomer(CustomerList list){ System.out.println("***************添加用户*************"); System.out.print("姓名:"); //从控制台获取字符串,以下都是类似 String str1=CMUtility.readString(3); System.out.print("性别:"); String str2=CMUtility.readString(2); System.out.print("年龄:"); int age=CMUtility.readInt(); System.out.print("电话:"); String str3=CMUtility.readString(20); System.out.print("邮箱:"); String str4=CMUtility.readString(20); Customer c1=new Customer(str1,str2,age,str3,str4); list.addCustomer(c1); System.out.println("***************添加完成*************\n"); } //修改客户菜单 public void modifyCustomer(CustomerList list){ System.out.println("***************修改客户*************\n"); System.out.print("请输入用户编号(-1退出):"); //从控制台获取数字 int number=CMUtility.readInt(); if(number==-1){ return; }else{ //获取某个对象 Customer c=list.getCustomer(number); System.out.print("姓名("+c.getName()+"):"); //修改值,如果直接按回车就返回设置的默认值,以下类似 String str1=CMUtility.readString( 3, c.getName()); System.out.print("性别("+c.getSex()+"):"); String str2=CMUtility.readString(2, c.getSex()); System.out.print("年龄("+c.getAge()+"):"); int age=CMUtility.readInt(c.getAge()); System.out.print("电话("+c.getPhone()+"):"); String str3=CMUtility.readString(20,c.getPhone()); System.out.print("邮箱("+c.getEmail()+"):"); String str4=CMUtility.readString(20,c.getEmail()); Customer endc=new Customer(str1,str2,age,str3,str4); //修改用户 list.replaceCustomer(number,endc); System.out.println("***************修改完成*************\n"); } } //删除客户 public void deleteCustomer(CustomerList list){ System.out.println("***************删除客户*************\n"); System.out.print("请输入用户编号(-1退出):"); int number=CMUtility.readInt(); if(number==-1){ return; }else{ System.out.print("确定删除吗?(Y/N)"); char chr=CMUtility.readConfirmSelection(); if(chr=='Y'){ list.deleteCustomer(number-1); System.out.println("***************删除完成*************\n"); }else{ return; } } } //打印所有用户 public void listAllCustomers(CustomerList list){ System.out.println("***************客户列表*************\n"); list.getAllCustomers(); System.out.println("***************客户列表完成*************\n"); } //主模块的主方法 public static void main(String[] args){ //创建对象 Customerview cv=new Customerview(); CustomerList list=new CustomerList(10); //先将flag设置为true boolean flag=true; //利用循环体do while 来实现先运行一遍主菜单 do{ cv.enterMainMenu(); //获取字符 char c=CMUtility.readMenuSelection(); switch(c){ case '1': cv.addNewCustomer(list); break; case '2': cv.modifyCustomer(list); break; case '3': cv.deleteCustomer(list); break; case '4': list.getAllCustomers(); break; case '5': System.out.print("确定退出吗?(Y/N)"); char chr=CMUtility.readConfirmSelection(); if(chr=='Y'){ flag=false; } break; } }while(flag); } }
运行截图
1、主页面
2、添加客户
3、客户列表
4、修改客户
5、删除客户
6、退出
总结
本次实现客户信息管理系统主要是通过对象来存储用户,将用户数据封装在对象中,然后将对象存储在链表中,为了方便还创建主模块来方便的调用用户数据,更加直观的对用户进行操作!!!希望大家有问题能够指正,谢谢,❤!!!