目标

  • 模拟实现一个基于文本界面的《客户信息管理软件》
  • 进一步掌握编程技巧和调试技巧,熟悉面向对象编程
  • 主要涉及以下知识点:
    • 类结构的使用:属性、方法及构造器
    • 对象的创建与使用
    • 类的封装性
    • 声明和使用数组
    • 数组的插入、删除和替换
    • 关键字的使用:this


需求说明

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

主菜单:

  1. -----------------客户信息管理软件-----------------<br /> 1 户<br /> 2 户<br /> 3 户<br /> 4 表<br /> 5 退 出<br /> 请选择(1-5):_
  • 每个客户的信息被保存在Customer对象中。
  • 以一个Customer类型的数组来记录当前所有的客户。
  • 每次“添加客户”(菜单1)后,客户(Customer)对象被添加到数组中。
  • 每次“修改客户”(菜单2)后,修改后的客户(Customer)对象替换数组中原对象。
  • 每次“删除客户”(菜单3)后,客户(Customer)对象被从数组中清除。
  • 执行“客户列表 ”(菜单4)时,将列出数组中所有客户的信息。


添加客户的界面:

……
请选择(1-5):1
——————————-添加客户——————————-
姓名:佟刚
性别:男
年龄:35
电话:010-56253825
邮箱:tongtong@atguigu.com
——————————-添加完成——————————-

修改客户的界面:

……
请选择(1-5):2
——————————-修改客户——————————-
请选择待修改客户编号(-1退出):1
姓名(佟刚):<__直接回车表示不修改__>
性别(男):
年龄(35):
电话(010-56253825):
邮箱(tongtong@atguigu.com):tongg@atguigu.com
——————————-修改完成——————————-

删除客户的界面:

……
请选择(1-5):3
——————————-删除客户——————————-
请选择待删除客户编号(-1退出):1
确认是否删除(Y/N):y
——————————-删除完成——————————-

客户列表的界面:

……
请选择(1-5):4
—————————————-客户列表—————————————-
编号 姓名 性别 年龄 电话 邮箱
1 佟刚 男 45 010-56253825 tong@abc.com
2 封捷 女 36 010-56253825 fengjie@ibm.com
3 雷丰阳 男 32 010-56253825 leify@163.com
————————————-客户列表完成————————————-

项目的搭建

Customer类的设计

Customer为实体类,用来封装客户信息
该类封装客户的以下信息:

  • String name :客户姓名
  • char gender :性别
  • int age :年龄
  • String phone :电话号码
  • String email :电子邮箱

提供各属性的get/set方法
提供所需的构造器(可自行确定)

实现Customer类

  1. 按照设计要求编写Customer类,并编译。
  2. 在Customer 类中临时添加一个main方法中,作为单元测试方法。

    在方法中创建Customer对象,并调用对象的各个方法,以测试该类是否编写正确。

  1. package pers.zyx.CRM.bean;
  2. public class Customer {
  3. private String name;
  4. private char gender;
  5. private int age;
  6. private String phone;
  7. private String email;
  8. public Customer(){
  9. }
  10. public Customer(String name, char gender, int age, String phone, String email) {
  11. this.name = name;
  12. this.gender = gender;
  13. this.age = age;
  14. this.phone = phone;
  15. this.email = email;
  16. }
  17. public String getName() {
  18. return name;
  19. }
  20. public void setName(String name) {
  21. this.name = name;
  22. }
  23. public char getGender() {
  24. return gender;
  25. }
  26. public void setGender(char gender) {
  27. this.gender = gender;
  28. }
  29. public int getAge() {
  30. return age;
  31. }
  32. public void setAge(int age) {
  33. this.age = age;
  34. }
  35. public String getPhone() {
  36. return phone;
  37. }
  38. public void setPhone(String phone) {
  39. this.phone = phone;
  40. }
  41. public String getEmail() {
  42. return email;
  43. }
  44. public void setEmail(String email) {
  45. this.email = email;
  46. }
  47. }

CustomerList类的设计

CustomerList为Customer对象的管理模块,内部使用数组管理一组Customer对象
本类封装以下信息:

  • Customer[] customers:用来保存客户对象的数组
  • inttotal = 0 :记录已保存客户对象的数量

该类至少提供以下构造器和方法:

  • public CustomerList(int totalCustomer)
  • public boolean addCustomer(Customer customer)
  • public boolean replaceCustomer(int index, Customer cust)
  • public boolean deleteCustomer(int index)
  • public Customer[] getAllCustomers()
  • public Customer getCustomer(int index)
  • public int getTotal()

public CustomerList(int totalCustomer)

  • 用途:构造器,用来初始化customers数组
  • 参数:totalCustomer:指定customers数组的最大空间

public boolean addCustomer(Customercustomer)

  • 用途:将参数customer添加到数组中最后一个客户对象记录之后
  • 参数:customer指定要添加的客户对象
  • 返回:添加成功返回true;false表示数组已满,无法添加

public boolean replaceCustomer(int index, Customer cust)

  • 用途:用参数customer替换数组中由index指定的对象
  • 参数:customer指定替换的新客户对象

    1. index指定所替换对象在数组中的位置,从0开始
  • 返回:替换成功返回true;false表示索引无效,无法替换

public boolean deleteCustomer(int index)

  • 用途:从数组中删除参数index指定索引位置的客户对象记录
  • 参数: index指定所删除对象在数组中的索引位置,从0开始
  • 返回:删除成功返回true;false表示索引无效,无法删除

public Customer[] getAllCustomers()

  • 用途:返回数组中记录的所有客户对象
  • 返回: Customer[] 数组中包含了当前所有客户对象,该数组长度与对象个数相同。

public Customer getCustomer(int index)

  • 用途:返回参数index指定索引位置的客户对象记录
  • 参数: index指定所要获取的客户在数组中的索引位置,从0开始
  • 返回:封装了客户信息的Customer对象


实现CustomerList类

  1. 按照设计要求编写CustomerList类,并编译
  2. 在CustomerList类中临时添加一个main方法中,作为单元测试方法。
  3. 在方法中创建CustomerList对象(最多存放5个客户对象),然后分别用模拟数据调用以下各个方法,以测试各方法是否编写正确:
  • addCustomer()
  • replaceCustomer()
  • deleteCustomer()
  • getAllCustomers()
  • getCustomer()
  • getTotal()


  1. package pers.zyx.CRM.service;
  2. import pers.zyx.CRM.bean.Customer;
  3. public class CustomerList {
  4. private Customer[] customers;
  5. private int total = 0;
  6. public CustomerList(int totalCustomer){
  7. customers = new Customer[totalCustomer];
  8. }
  9. public boolean addCustomer(Customer customer){
  10. if(total >= customers.length){
  11. return false;
  12. }else{
  13. customers[total++] = customer;
  14. return true;
  15. }
  16. }
  17. public boolean replaceCustomer(int index, Customer cust){
  18. if(index >= total || index < 0){
  19. return false;
  20. }else{
  21. customers[index] = cust;
  22. return true;
  23. }
  24. }
  25. public boolean deleteCustomer(int index){
  26. if(index >= total || index < 0){
  27. return false;
  28. }else{
  29. for(int i = index ; i < total - 1 ; i ++ ){
  30. customers[i] = customers[i + 1];
  31. }
  32. customers[total--] = null;
  33. return true;
  34. }
  35. }
  36. public Customer[] getAllCustomers(){
  37. Customer[] custs = new Customer[total];
  38. for(int i = 0 ; i < total ; i ++ ){
  39. custs[i] = customers[i];
  40. }
  41. return custs;
  42. }
  43. public Customer getCustomer(int index){
  44. if(index < 0 || index >= total){
  45. return null;
  46. }else{
  47. return customers[index];
  48. }
  49. }
  50. public int getTotal(){
  51. return total;
  52. }
  53. }


CustomerView类的设计

CustomerView为主模块,负责菜单的显示和处理用户操作
本类封装以下信息:

  • CustomerList customerList = new CustomerList(10);
  • 创建最大包含10个客户对象的CustomerList 对象,供以下各成员方法使用。

该类至少提供以下方法:

  • public void enterMainMenu()
  • private void addNewCustomer()
  • private void modifyCustomer()
  • private void deleteCustomer()
  • private void listAllCustomers()
  • public static void main(String[] args)

public void enterMainMenu()

  • 用途:显示主菜单,响应用户输入,根据用户操作分别调用其他相应的成员方法(如addNewCustomer),以完成客户信息处理。

private void addNewCustomer()
private void modifyCustomer()
private void deleteCustomer()
private void listAllCustomers()

  • 用途:这四个方法分别完成“添加客户”、“修改客户”、“删除客户”和“客户列表”等各菜单功能。
  • 这四个方法仅供enterMainMenu()方法调用。

public static void main(String[] args)

  • 用途:创建CustomerView实例,并调用enterMainMenu()方法以执行程序。

实现CustomerView类

  1. 按照设计要求编写CustomerView类,逐一实现各个方法,并编译
  2. 执行main方法中,测试以下功能:
    1. 主菜单显示及操作是否正确
    2. 添加客户 操作是否正确,给用户的提示是否明确合理;测试当添加的客户总数超过10时,运行是否正确
    3. 修改客户 操作是否正确,给用户的提示是否明确合理;
    4. 删除客户 操作是否正确,给用户的提示是否明确合理;
    5. 客户列表 操作是否正确,表格是否规整;


  1. package pers.zyx.CRM.view;
  2. import pers.zyx.CRM.bean.Customer;
  3. import pers.zyx.CRM.service.CustomerList;
  4. import pers.zyx.CRM.util.CMUtility;
  5. public class CustomerView {
  6. private CustomerList customerList = new CustomerList(10);
  7. public CustomerView(){
  8. Customer cust = new Customer("马云",'男',25,"66776677","mayun@gmail.com");
  9. customerList.addCustomer(cust);
  10. }
  11. public void enterMainMenu(){
  12. boolean isFlag = true;
  13. while(isFlag){
  14. System.out.println("\n-----------------客户信息管理软件-----------------\n");
  15. System.out.println(" 1 添 加 客 户");
  16. System.out.println(" 2 修 改 客 户");
  17. System.out.println(" 3 删 除 客 户");
  18. System.out.println(" 4 客 户 列 表");
  19. System.out.println(" 5 退 出\n");
  20. System.out.print(" 请选择(1-5):");
  21. char menu = CMUtility.readMenuSelection();
  22. switch (menu){
  23. case '1':
  24. addNewCustomer();
  25. break;
  26. case '2':
  27. modifyCustomer();
  28. break;
  29. case '3':
  30. deleteCustomer();
  31. break;
  32. case '4':
  33. listAllCustomers();
  34. break;
  35. case '5':
  36. System.out.println("确认是否退出(Y|N)");
  37. char isExit = CMUtility.readConfirmSelection();
  38. if(isExit == 'Y'){
  39. isFlag = false;
  40. }
  41. }
  42. }
  43. }
  44. private void addNewCustomer(){
  45. System.out.println("---------------------添加客户---------------------");
  46. System.out.print("姓名:");
  47. String name = CMUtility.readString(4);
  48. System.out.print("性别:");
  49. char gender = CMUtility.readChar();
  50. System.out.print("年龄:");
  51. int age = CMUtility.readInt();
  52. System.out.print("电话:");
  53. String phone = CMUtility.readString(15);
  54. System.out.print("邮箱:");
  55. String email = CMUtility.readString(15);
  56. Customer customer = new Customer(name,gender,age,phone,email);
  57. boolean flag = customerList.addCustomer(customer);
  58. if(flag == true){
  59. System.out.println("---------------------添加完成---------------------");
  60. }else{
  61. System.out.println("---------------------添加失败---------------------");
  62. }
  63. }
  64. private void modifyCustomer(){
  65. System.out.println("---------------------修改客户---------------------");
  66. Customer cust;
  67. int index;
  68. for( ; ; ){
  69. System.out.print("请选择待修改客户编号(-1退出):");
  70. index = CMUtility.readInt();
  71. if(index == -1) {
  72. return;
  73. }
  74. cust = customerList.getCustomer(index - 1);
  75. if(cust == null){
  76. System.out.println("无法找到指定客户!");
  77. }else {
  78. break;
  79. }
  80. }
  81. System.out.print("姓名(" + cust.getName() + "):");
  82. String name = CMUtility.readString(4, cust.getName());
  83. System.out.print("性别(" + cust.getGender() + "):");
  84. char gender = CMUtility.readChar(cust.getGender());
  85. System.out.print("年龄(" + cust.getAge() + "):");
  86. int age = CMUtility.readInt(cust.getAge());
  87. System.out.print("电话(" + cust.getPhone() + "):");
  88. String phone = CMUtility.readString(15, cust.getPhone());
  89. System.out.print("邮箱(" + cust.getEmail() + "):");
  90. String email = CMUtility.readString(15, cust.getEmail());
  91. cust = new Customer(name, gender, age, phone, email);
  92. boolean isReplace = customerList.replaceCustomer(index - 1, cust);
  93. if (isReplace) {
  94. System.out
  95. .println("---------------------修改完成---------------------");
  96. } else {
  97. System.out.println("----------无法找到指定客户,修改失败--------------");
  98. }
  99. }
  100. private void deleteCustomer(){
  101. System.out.println("---------------------删除客户---------------------");
  102. int index;
  103. Customer cust;
  104. for (;;) {
  105. System.out.print("请选择待删除客户编号(-1退出):");
  106. index = CMUtility.readInt();
  107. if (index == -1) {
  108. return;
  109. }
  110. cust = customerList.getCustomer(index - 1);
  111. if (cust == null) {
  112. System.out.println("无法找到指定客户!");
  113. } else
  114. break;
  115. }
  116. System.out.print("确认是否删除(Y|N):");
  117. char yn = CMUtility.readConfirmSelection();
  118. if (yn == 'N')
  119. return;
  120. boolean isDelete = customerList.deleteCustomer(index - 1);
  121. if (isDelete) {
  122. System.out.println("---------------------删除完成---------------------");
  123. } else {
  124. System.out.println("----------无法找到指定客户,删除失败--------------");
  125. }
  126. }
  127. private void listAllCustomers(){
  128. System.out.println("---------------------添加客户---------------------");
  129. int total = customerList.getTotal();
  130. if(total == 0){
  131. System.out.println("没有客户记录");
  132. }else {
  133. System.out.println("编号\t姓名\t性别\t年龄\t\t电话\t\t邮箱");
  134. Customer[] custs = customerList.getAllCustomers();
  135. for(int i = 0 ; i < custs.length ; i ++ ){
  136. Customer cust = custs[i];
  137. System.out.println((i + 1) + "\t" + cust.getName() + "\t" + cust.getAge()+ "\t" + cust.getGender() + "\t" + cust.getPhone() + "\t" +
  138. cust.getEmail());
  139. }
  140. }
  141. System.out.println("------------------客户列表加载完毕------------------");
  142. }
  143. public static void main(String[] args){
  144. CustomerView cView = new CustomerView();
  145. cView.enterMainMenu();
  146. }
  147. }


思考

当软件退出时,所有客户信息便丢失了!运用什么手段可以将这些信息长久保存,以便在下一次运行软件时继续使用?

参考