1.项目要求

模拟实现基于文本界面的《客户信息管理软件》。 该软件能够实现对客户对象的插入、修改和删除(用数组实现),并能够打印客户明细表

2.将项目抽象为几个类

  1. 我们可以先将项目抽离为几个简单的类,比如客户类(Customer),客户信息列表类(CustomList),工具类(tools)等

    客户类:用来封装客户信息

    客户列表类:为Customer对象的管理模块,内部使用数组管理一组Customer对象,对客户对象进行增删改查

    工具类:方便地实现键盘访问,比如键入字符,数字等

    主视图类:负责菜单的显示和对用户操作的处理,比如添加客户,修改客户等

  2. 在写项目之前,可以考虑将不同功能的类放在不同包下,每个包负责不同的功能,实现模块化管理。当然这个项目是很简单的,也可以直接都放在一个包下。

3.第一步,创建客户类

首先我们需要将客户的信息封装到客户类中,就像C++中定义结构体一样,定义一个客户数据类型。java中我们就是定义一个客户类,然后对这个类进行封装,只提供部分接口供外部使用

代码实现:

public class Customer {private String name ; //客户姓名private char gender  ;//性别private int age;       // 年龄private String phone;//电话号码private String email ; //电子邮箱
​public String getName() {return name;}
​public void setName(String name) {this.name = name;}
​public char getGender() {return gender;}
​public void setGender(char gender) {this.gender = gender;}
​public int getAge() {return age;}
​public void setAge(int age) {this.age = age;}
​public String getPhone() {return phone;}
​public void setPhone(String phone) {this.phone = phone;}
​public String getEmail() {return email;}
​public void setEmail(String email) {this.email = email;}
​public Customer() {}
​public Customer(String name, char gender, int age, String phone, String email) {this.name = name;this.gender = gender;this.age = age;this.phone = phone;this.email = email;}
}

4.创建客户列表类

我们有了客户信息,这时候出现一个问题,我们用什么去作为客户信息的容器呢?

我们又如何对客户信息数据进行增删改查的操作呢?

这时候我们第一想到装数据的就是数组,所以我们可以用一个客户对象数组来装载我们的客户信息。

在C语言中,我们的做法是定义一个结构体,结构体中放客户对象数组和一个变量来动态更新客户的个数。

而在java中,我们需要把客户列表抽象为一个类,这个类的属性有客户对象数组和一个记录保存对象个数的变量

以及与之相关的增删改查等各个方法。

public class CustomerList {private Customer[] customers;   //用来保存客户对象的数组private int total = 0;  //记录已保存客户的数量
​/*用途:构造器,用来初始化customers数组参数:totalCustomer:指定customers数组的最大空间*/public CustomerList(int totalCustomer) {this.customers = new Custom[totalCustomer];this.total = 0;}
​
/*    用途(增):将参数customer添加到数组中最后一个客户对象记录之后参数:customer指定要添加的客户对象返回:添加成功返回true;false表示数组已满,无法添加*/public boolean addCustomer(Customer customer) {if(this.customers != null && this.total< customers.length){customers[total] = customer;this.total++;return true;}return false;}
​/*用途(改):用参数customer替换数组中由index指定的对象参数:customer指定替换的新客户对象index指定所替换对象在数组中的位置,从0开始返回:替换成功返回true;false表示索引无效,无法替换*/public boolean replaceCustomer(int index, Customer cust){if(index < total && index >= 0){customs[index] = cust;return true;}return false;}
​
​/*用途(删):从数组中删除参数index指定索引位置的客户对象记录参数: index指定所删除对象在数组中的索引位置,从0开始返回:删除成功返回true;false表示索引无效,无法删除*/public boolean deleteCustomer(int index) {if(index >= 0 && index <total){for(int i = index ; i < total - 1; i++){customers[i] = customs[i+1];}/*customers[total-1] = null;total--;*/customs[--total] = null;   //上面的精缩return true;
​
​}return false;}
​
​/*用途(查):返回数组中记录的所有客户对象返回: Customer[] 数组中包含了当前所有客户对象,该数组长度与对象个数相同。*/public Custom[] getAllCustomers(){Custom[] p1 = new Customers[this.total];for(int i = 0 ; i < this.total ; i++){p1[i] = customers[i];}return p1;}
​/* 用途(查):返回参数index指定索引位置的客户对象记录参数: index指定所要获取的客户在数组中的索引位置,从0开始返回:封装了客户信息的Customer对象*/public Custom getCustomer(int index) {if(index >= 0 && index < total) {return customers[index];}return null;}
​/*** 返回Customer对象的个数* @return*/public int getTotal(){return total;}
​}

5.创建工具类

我们知道,这个项目需要用户不断的用键盘键入数据,那么,我们就可以用一个工具类将常用的键入字符串,键入数字等操作封装为方法

方便操作。这里是借用尚硅谷提供的工具类,直接复制然后粘贴到自己的工具类中即可,这里贴下代码给大家:

import java.util.*;
public class KeyBoard {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;}
​
}

6.开始我们的主视图类(进入正题)

我们先从主视图类开始书写,一步一步捋清楚整体脉络。

主视图需要什么功能,换句话说,他需要完成哪些操作?

  • 需要一个对象列表类的实例(用来存储添加的对象)

  • 需要一个显示菜单,让客户完成操作的功能(外界唯一能操作的接口)

  • 需要有添加客户的功能

  • 需要有修改客户的功能

  • 需要有删除客户的功能

  • 需要有查看全部客户的功能

  • 退出

  • 还需要一个main方法作为程序的入口

用户除了通过显示菜单来操作增删改查外,并不能直接调用其它四个方法,即可以理解为菜单界面就是我们提供给客户的

操作按钮,客户只需要通过按钮来操作下面四种功能即可,这就是面向对象的封装性

代码实现:

public class CustomerView {//创建一个能容纳十个对象的信息表private CustomerList list = new CustomList(10);//用户操作界面public void enterMainMenu() {};//添加联系人private void addNewCustomer() {};//修改联系人private void modifyCustomer(){};//删除联系人private void deleteCustomer(){};//查看用户列表private void listAllCustomers(){};public static void main(String[] args) {
​}
}

首先,我们思考一下,main方法需要的执行的功能是什么呢?

  1. 创建主视图类

  2. 调用主视图类中的菜单方法

public static void main(String[] args){CustomerView view = new CustomerView();view.enterMainMenu();}

没错,可以说主代码就是这两行代码,也就是说,这两行代码就完成了全部功能,接下来我们就要一步步去实现封装在这

两行中的代码。

菜单方法的需要的功能:

  • 显示界面

  • 完成基本的用户操作,如添加客户,修改客户,删除客户,查看客户

    显示界面完成!

    public void enterMainMenu(){
    ​System.out.println("\n-----------------客户信息管理软件-----------------\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 enterMainMenu(){
    ​while (true){System.out.println("\n-----------------客户信息管理软件-----------------\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):");
    ​char select = KeyBoard.readMenuSelection();switch (select){case '1'://添加新客户addNewCustomer(); break; case '2'://修改客户modifyCustomer();break;case '3'://删除客户deleteCustomer();break;case '4'://查看客户列表listAllCustomers();break;case '5':break;}}

完成菜单方法后我们就需要一步步去实现其他方法

7.完成剩下的四个方法

1.添加新客户

既然要添加新客户,我们先捋清楚思路,完成添加新客户需要的步骤如下:

  1. 用name,gender,age,phone,email等变量来接收键盘输入的各个值

  2. 根据这些值new出一个新的客户对象

  3. 将这个客户对象添加进对象列表中,并判断对象数组是否已经满了

  4. 满了输出对象数组已经满了,否则输出添加成功

代码实现:

private void addNewCustomer(){System.out.println("---------------------添加客户---------------------");System.out.print("姓名:");String name = KeyBoard.readString(5);System.out.print("性别:");char gender = KeyBoard.readChar();System.out.print("年龄:");int age = KeyBoard.readInt();System.out.print("电话:");String phone = KeyBoard.readString(15);System.out.print("邮箱:");String email = KeyBoard.readString(20);
​// 封装为一个对象Customer customer = new Customer(name,gender,age,phone,email);// 将此对象添加到CustomerList里的数组中boolean flag = List.addCustomer(customer);
​if (flag) {System.out.println("---------------------添加完成---------------------");
​} else {System.out.println("人数已达上限,添加失败!");}
​}

2.修改新客户

同样如上,捋清思路:

  1. 设置一个变量index来保存要修改对象的索引编号。

  2. 创建一个临时客户对象来指向要修改的客户对象,并判断是否为空,为空表示没有该客户。

    直接返回,不需要继续执行命令(注:两个对象直接赋值是引用传递,是地址值的传递,两个对象都指向同一片地址空间,这里新创建的对象就是要修改对象的别名)

  3. 如果不为空,则开始修改。再次用name,gender,age,phone,email等变量来接收键盘输入的各个值

  4. 然后根据这些值new出一个新的客户对象

  5. 将原先的列表中对象替换掉

实现如下:

private void modifyCustomer(){System.out.println("---------------------修改客户---------------------");
​Customer customer;int index;
​while (true){System.out.print("请选择待修改客户编号(-1退出):");//从键盘读入一个数字index = CMUtility.readInt();
​if(index == -1){return;  //不能用break,return结束方法,break退出循环,还是会执行下面修改的语句}// 对于用户来讲,我们让index 默认从1开始。customer = custList.getCustomer(index-1);if(customer == null){System.out.println("无法找到客户");}else {break;}}//修改客户信息System.out.print("姓名(" + customer.getName() + "):");// 如果用户输入了姓名,则返回用户输入的信息,如果用户没有输入,直接回车,则返回customer.getName()String name = KeyBoard.readString(5, customer.getName());
​System.out.print("性别(" + customer.getGender() + "):");char gender = KeyBoard.readChar(customer.getGender());
​System.out.print("年龄(" + customer.getAge() + "):");int age = KeyBoard.readInt(customer.getAge());
​System.out.print("电话(" + customer.getPhone() + "):");String phone = KeyBoard.readString(13, customer.getPhone());
​System.out.print("邮箱(" + customer.getEmail() + "):");String email = KeyBoard.readString(15, customer.getEmail());// 获取用户输入的属性以后,得到的最新的Customer对象customer = new Customer(name, gender, age, phone, email);
​boolean flag = list.replaceCustomer(index - 1, customer);if (flag) {System.out.println("---------------------修改完成---------------------");} else {System.out.println("---------------------修改失败---------------------");}}

3.删除新客户

思路:

  1. 用index接收要删除对象的索引值

  2. 创建一个临时客户对象来指向要删除的客户对象,并判断是否为空,为空表示没有该客户。

    直接返回,不需要继续执行命令。

  3. 不为空这需要确认是否删除。

代码如下:

private void deleteCustomer(){System.out.println("---------------------删除客户---------------------");
​Customer customer;int index;
​while(true) {System.out.print("请选择待删除客户编号(-1退出):");// 针对普通用户来讲:此index从 1开始index = KeyBoard.readInt();if (index == -1) {return;}
​customer = list.getCustomer(index - 1);if (customer == null) {System.out.println("无法找到指定客户!");} else {break;}}
​// 一旦找到相应的索引位置的customer以后,让用户决定是否确认删除System.out.print("确认是否删除(Y/N):");char deleteOrNot = KeyBoard.readConfirmSelection();if (deleteOrNot == 'Y') {boolean flag = list.deleteCustomer(index - 1);if (flag) {System.out.println("---------------------删除完成---------------------");} else {System.out.println("---------------------删除失败---------------------");}} else {return;}
​
​}

4.查看客户列表

思路:

  1. 先是创建一个客户对象数组用来接收客户列表中的所有对象(实质上是值传递)

  2. 然后判断数组是否为空,不为空则循环输出数组中每个对象的所有信息(这里方式一太麻烦了,

    所以可以倒回去给客户类增加一个返回全部信息的方法)

    //显示当前对象的信息public String info(){return name + "\t" + gender + "\t" + age + "\t" + phone + "\t" + email;}
private void listAllCustomers(){System.out.println("---------------------------客户列表---------------------------");// 获取所有的客户Customer[] customers = list.getAllCustomers();if(customers.length == 0){System.out.println("没有任何客户记录!");}else {System.out.println("编号\t姓名\t性别\t年龄\t电话\t\t邮箱");for (int i = 0; i < customers.length; i++) {//临时存储数组里的客户对象Customer cust = customers[i];// 方式一:// System.out.println((i + 1) + "\t" + cust.getName() + "\t"// + cust.getGender() + "\t" + cust.getAge() + "\t"// + cust.getPhone() + "\t\t" + cust.getEmail());// 方式二:System.out.println((i + 1) + "\t" + cust.info());
​}}System.out.println("-------------------------客户列表完成-------------------------");}

8.总结

这里其实还有很多可以完善的功能

  • 对电话号码,邮箱的判断不够严谨,可以再加一些方法进行判断

  • 只能保存在内存中,一旦项目关闭数据清除,可以用I/O流保存到文件中,以后还可以保存到数据库中,实现长期存储

  • 界面过于简陋,可以使用GUI进行一下美化

用java简单写一个信息管理系统(尚硅谷项目二)相关推荐

  1. 用Java写一个信息管理系统与学习心得

    目录 创建项目所需要的依赖项 创建目录 主要实现功能: 添加武器信息: 更新武器信息: 删除武器信息 查找武器 分页 排序 设置页面效果 效果展示: 心得体会: 最后为大伙奉上源码: Java期末项目 ...

  2. java nextline_Java写一个学生管理系统

    前言 其实作为一名Java的程序猿,无论你是初学也好,大神也罢,学生管理系统一直都是一个非常好的例子,初学者主要是用数组.List等等来写出一个简易的学生管理系统,二.牛逼一点的大神则用数据库+swi ...

  3. 尚硅谷项目二:尚硅谷总结

    CMUtility 工具类 import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; /* ...

  4. 基于Java+控制台实现车辆信息管理系统

    基于Java+控制台实现车辆信息管理系统 一.系统介绍 二.功能展示 1.主要功能 2.查看所有车辆信息 3.车辆信息添加 4.车辆信息查询 5.车辆信息删除 三.系统实现 1.car.java 四. ...

  5. 基于Eclipse+Java+Swing+Mysql图书信息管理系统

    基于Eclipse+Java+Swing+Mysql图书信息管理系统 一.系统介绍 二.功能展示 1.主页 2.新增图书信息 3.删除图书信息 三.数据库 四.其他系统实现 五.获取源码 一.系统介绍 ...

  6. 基于Java+Swing+Mysql员工信息管理系统

    基于Java+Swing+Mysql员工信息管理系统 一.系统介绍 二.功能展示 1.主页 2.查询员工信息 3.删除员工信息 三.数据库 四.其他系统实现 五.获取源码 一.系统介绍 该系统实现了查 ...

  7. Java+Swing+mysql用户信息管理系统

    Java+Swing+mysql用户信息管理系统 一.系统介绍 二.功能展示 1.管理员登陆 2.用户信息查询 3.用户信息添加 4.用户信息修改 5.用户信息删除 三.项目相关 3.1 乱码问题 3 ...

  8. Java+Swing+mysql学生信息管理系统

    Java+Swing+mysql学生信息管理系统 一.系统介绍 二.功能展示 1.管理员登陆 2.学生信息查询 3.学生信息添加 4.学生信息修改 5.删除 三.系统实现 1.StudentFrame ...

  9. Java语言写一个简单的学生信息管理系统,通过JDBC连接数据库对学生信息进行增删改查,采用三层思想和DBUtils第三方框架。

    我把源代码和sql文件放GitHub上了,你们可以自行下载:https://github.com/fenglily1/student. 有问题可以留言或私信,我看到就会回. 进阶版加上页面的管理系统在 ...

最新文章

  1. linux下运行gnuplot,Gnuplot Linux版下载
  2. 没有会员wps合并多个sheet_WPS「合并文档」功能,如何“唰”一下把多个文档合并到一起?...
  3. Tensorflow利用函数修饰符@tf.custom_gradients自定义函数梯度
  4. Java 阿里巴巴数据源_阿里P7教你如何使用 Spring 配置动态数据源实现读写分离
  5. linux5种IO模型以及同步异步,阻塞非阻塞
  6. 想获得腾讯发行机会?来“腾讯GAD•游戏创新大赛”
  7. linux搭建SonarQube代码质量平台_Oracle 最新详细版本
  8. java 跨类 调用 model_Model.java中的这两个方法,为什么不能在子类中调用,或者包内调用也行啊。...
  9. Haiku OS 的黎明
  10. 从 Angular 移植到 React,代码量减少了 20%
  11. linux登录指令 pgsql_一句一例解读20条Linux常用指令,学会了你就入门了
  12. jdk LinkedList源码解析
  13. 基于 snowNLP的微博评论数据情感分析
  14. 计算机考研自命题院校双非,计算机考研408——951211院校汇总
  15. 供应链管理-降低产品复杂度
  16. Excel小技巧分享-自动缩放的表格来了
  17. Premiere Pro之视频转场效果(四)
  18. Xtend调用Scilab
  19. 【C4D材质库合集】吐血分享!5.7GB!4000个+材质球!最新最全高质量C4D材质库合集
  20. 泛洪攻击以及防护方法

热门文章

  1. 计算机进制bcd啥意思,bcd码和二进制码有什么区别
  2. 基于BS架构的研究生奖助学金评审系统
  3. 服务器不显示串口,关于串口服务器的配置问题
  4. 分类时为什么都选择one hot编码
  5. jQuery 自制上传头像插件-附带Demo实例(ajaxfileupload.js第三弹)
  6. UE4 粒子特效基础学习 (04-光圈效果制作)
  7. _IO,_IOR,_IOW和_IORW的含义
  8. linux中用参数代替键盘输入,linux shell在while中用read从键盘输入的实现
  9. TensorFlow on Android:训练模型
  10. 利用shell脚本批量判断目标ip存活情况