一.项目介绍
1.简介:这是一个基于文本界面的简单项目,用于存储客户信息的一个简单系统
2.需要用到的知识:
(1)对象数组的创建和数组的初始化
(2)类和对象(属性,方法和构造器的调用)
(3)四种权限修饰符的理解和this指针的运用
(4)类的封装
(5)多对象的协同工作
3.功能:
主要功能是:添加丶修改丶删除丶查询。是一个项目所必需的4种功能。
二.项目展示
1.菜单主界面:
2.添加客户功能:
3.修改客户功能:
4.删除客户功能:
5.查看客户功能:
三.项目设计过程:
1.项目流程图设计
(1)总体设计思路流程:
(2)添加客户功能流程:
(3)修改客户功能实现:
(4).删除功能流程:
(5).显示客户信息流程:
2.项目具体运行思路
(1).创建三个类,分别是
Customer :用于初始化客户的属性信息(姓名,年龄等),包含属性的get和set的方法,用来封装客户信息。
CustomerList :里面包含增丶改丶删丶查的主要核心方法,有CustomerList来调用
CustomerView:为主模块,用于设置界面和调用上面两个主要功能,并完善一些细节。
三者之间的关系:
(2)Customer丶CustomerList丶CustomerView中的属性和方法
1.Customer为实体类,用来封装客户信息,该类封装的客户属性有:
- String name : 客户姓名
- char gender : 性别
- int age :年龄
- String phone :电话号码
- String email : 电子邮箱
提供各个属性的get/set方法和所需的构造器(参数根据自己需要设定,这个项目中需要用到上面5个参数)。
2.CustomerList 为Customer对象的管理模块,内部使用数组管理Customer对象。其需要用到的属性和方法是:
- Customer[ ]customers : 用来保存客户对象的数组
- int total = 0 :用来记录已保存的客户数量
该类提供一下构造器和方法:
-
public CustomerList(int totalCustomer)
用途:构造器,用来初始化customer数组
参数:totalCustomer 为数组的长度 -
public boolean addCustomer(Cusomer customer)
用途:将参数customer添加到数组中
参数:由CustomerView中传递过来指定要添加的客户
返回:true表示添加成功,false表示数组已经满了,添加失败 -
public boolean replaceCustomer(int index, Customer customer)
用途:用于修改指定的参数customer
参数:index,为指定索引对象在数组中的位置,由0开始。customer为修改后的新对象
返回:替换成功返回true,失败则false -
public boolean deleteCustomer(int index)
用途:从数组中删除index索引的客户对象
参数:index为所指定的删除对象,从0开始
返回:true删除成功,false删除失败 -
public boolean ListCustomer( )
用途:返回数组中记录的所有对象
返回:Customer[ ] 数组中包含了当前所有的客户对象 -
public Customer getCustomer(int index)
用途:返回参数index指定索引位置的客户对象记录。
参数:index指定索要获取的客户在数组中的索引位置,从0开始。
返回:封装了客户信息的Customer对象 -
public void showListCustomer( )
用途:输出customer对象中的属性
3.CustomerView为主模块,负责菜单的显示和处理客户操作。
含有的客户属性:
- customerList customer = new CustomerList(10)
new一个长度为10的数组customers
该类要用到的方法:
-
public void enterMain( )
用途:显示主菜单,响应用户输入,根据用户操作分别调用其他相应的方法,以完成客户信息处理 -
private viud addNewCustomer()
-
private void modifyCustomer()
-
private void deleteCustomer( )
-
private void ListCustomer( )
用途:这四个方法分别用来实现增丶改丶删丶查等各菜单功能,由enterMain()来调用 -
Public static void main(String[ ] args)
用途:创建CustomerView实例,并调用enterMain()方法
四.源码
1.CMUtility类(工具类,里面的代码原理可以不用搞懂,会调用就行)
import java.util.*;
/**
* CMutility工具类:
* 将不同的功能封装为方法,直接通过调用的方法使用它的功能,无需考虑其调用的细节
*
*/
public class CMUtility {
private static Scanner scanner = new Scanner(System.in);
/**
*
* @Description 用于界面菜单的选择。该方法读取键盘,如果用户键入’1’-’5’中的任意字符
* 则方法返回。返回值为用户键入字符。
* @author Bofu
* @Date 2019年8月9日下午3:58:42
* @return
*/
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.println("选择错误,请重新输入:");
}else break;
}
return c;
}
/**
*
* @Description 从键盘上读取一个字符,并将其作为方法的返回值
* @author Bofu
* @Date 2019年8月9日下午4:01:35
* @param limit
* @param blankReturn
* @return
*/
public static char readChar(){
String str = readKeyBoard(1,false);
return str.charAt(0);
}
/**
*
* @Description 从键盘读取一个字符,并将其作为方法的返回值。
如果用户不输入字符而直接回车,方法将以defaultValue 作为返回值。
* @author Bofu
* @Date 2019年8月9日下午4:05:53
* @param limit
* @param blankReturn
* @return
*/
public static char readChar(char defaultValue){
String str = readKeyBoard(1,true);
return (str.length() == 0)? defaultValue : str.charAt(0);
}
/**
*
* @Description 从键盘上读取一个不超过2位的整数,并将其作为方法的返回值。
* @author Bofu
* @Date 2019年8月9日下午4:08:42
* @param limit
* @param blankReturn
* @return
*/
public static int readInt(){
int n;
for(;;){
String str = readKeyBoard(2,false);
try{
n = Integer.parseInt(str);
break;
}catch (NumberFormatException e) {
System.out.println("数字输入错误,请重新输入");
}
}
return n;
}
/**
*
* @Description 从键盘读取一个长度不超过2位的整数,并将其作为方法的返回值。
如果用户不输入字符而直接回车,方法将以defaultValue 作为返回值。
* @author Bofu
* @Date 2019年8月9日下午4:12:34
* @param limit
* @param blankReturn
* @return
*/
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.println("数字输入错误,请重新输入");
}
}
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;
}
/**
*
* @Description 用于确认选择的输入。该方法从键盘读取‘Y’或’N’,并将其作为方法的返回值
* @author Bofu
* @Date 2019年8月9日下午4:20:46
* @param limit
* @param blankReturn
* @return
*/
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.println("选择错误,请重新输入:");
}
}
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;
}
}
2.Customer类
public class Customer {
//Customer的属性
private String name;
private char gender;
private int age;
private String phone;
private String 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;
}
/**
*
* @Description 5个属性的get和set的方法
* @author Bofu
* @Date 2019年8月10日下午8:05:12
* @param
*/
//name
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
//gender
public void setGender(char gender){
this.gender = gender;
}
public char getGender(){
return gender;
}
//age
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
//phone
public void setPhone(String phone){
this.phone = phone;
}
public String getPhone(){
return phone;
}
//email
public void Setemail(String email){
this.email = phone;
}
public String getEmail(){
return email;
}
/**
*显示对象数组中客户的属性
*/
public String getMessage(){
return name+"\t" + gender + "\t" + age + "\t" + phone + "\t" + email;
}
}
3.CustomerList类
public class CustomerList {
private Customer[] customers;//customers用于表示数组中的元素
private int total = 0; //客户的总数
/**
* 构造器,用于初始化customers
* @param totalCustomer
*/
public CustomerList(int totalCustomer){
customers = new Customer[totalCustomer];
}
/**
*
* @Description 将输入的顾客信息存储在这个空间中
* @author Bofu
* @Date 2019年8月10日下午9:07:57
* @param customer
* @return true则代表信息存储成功,false则表示信息存储失败
*/
public boolean addCustomer(Customer customer){
//形参customer,下面统一表示由CustomerView中传递过来的值
if(total > customers.length){
return false;
}
customers[total] = customer;
total++;
return true;
}
/**
*
* @Description 修改客户属性的方法
* @author Bofu
* @Date 2019年8月11日下午8:57:38
* @param index
* @param cust
* @return
*/
public boolean replaceCustomer(int index,Customer customer){
//将customerView封装好的customer直接赋值到要修改的客户数组上
customers[index] = customer;
return true;
}
/**
*
* @Description 删除客户的方法
* @author Bofu
* @Date 2019年8月11日下午8:56:01
* @param index
* @return
*/
public boolean deleteCustomer(int index){
if(index >= total){
return false;
}
//利用后面一个数组的元素覆盖前面的数组,然后将最后一个数组赋空值。
for(int i = index;i < total-1; i++){
customers[i] = customers[i+1];
}
customers[total-1] = null;
total--;
return true;
}
/**
*
* @Description 客户列表方法,将所有的customers数组中的元素打印出来
* @author Bofu
* @Date 2019年8月11日下午11:06:44
* @return cust
*/
public Customer[] ListCustomer(){
Customer []customer = new Customer[total];
for(int i = 0;i < total; i++){
customer[i] = customers[i];
}
return customer;
}
/**
*
* @Description 判断客户是否存在的方法
* @author Bofu
* @Date 2019年8月11日下午8:59:26
* @param index
* @return false 则客户不在列表之中, true客户存在
*/
public Customer getCustomer(int index){
if(index < 0 ||index >= total){
return null;
}
return customers[index];
}
/**
* 显示客户列表标题
*/
public void showListTitle(){
System.out.println("编号"+"\t姓名"+"\t性别"+"\t年龄"+"\t手机"+"\t\t邮箱");
}
}
4.CustomerView类
public class CustomerView {
//初始化数组,以下customer为类CustomerView的对象名
private CustomerList customer = new CustomerList(10);
public CustomerView(){
//以下cust来表示用来存储数组元素的Customer类的对象名
Customer cust = new Customer("老王", '男', 30, "010-5462135",
"laoWang@email.com");
customer.addCustomer(cust);
}
/**
*
* @Description 界面显示和控制其他函数的方法
* @author Bofu
* @Date 2019年8月10日下午8:20:00
*/
public void enterMain(){
//初始化一个isFlage用于跳出while()循环
boolean isFlage = true;
while(isFlage){
System.out.println("-----------------------客户信息管理界面-----------------------\n ");
System.out.println(" 1.添加客户 ");
System.out.println(" 2.修改客户 ");
System.out.println(" 3.删除客户 ");
System.out.println(" 4.查看客户 ");
System.out.println(" 5.退 出 ");
System.out.print(" 请选择1-5:");
//利用CMUtility类做工具,用作键盘输入1~5
char key = CMUtility.readMenuSelection();
switch(key){
case '1':
addNewCustomer();
break;
case '2':
modifyCustomer();
break;
case '3':
deleteCustomer();
break;
case '4':
listCustomer();
break;
case '5':
System.out.println("请问是否退出(Y/N):");
char isExit = CMUtility.readConfirmSelection();
if(isExit == 'Y'){
isFlage = false;
}
break;
}
}
}
/**
*
* @Description 用户增加的方法
* @author Bofu
* @Date 2019年8月10日下午8:21:33
*/
private void addNewCustomer(){
//以下都用到工具类的使用
System.out.println("-----------------------添加客户-----------------------");
System.out.print("姓名:");
String name = CMUtility.readString(4);
System.out.print("性别:");
char gender = CMUtility.readChar();
System.out.print("年龄:");
int age = CMUtility.readInt();
System.out.print("电话:");
String phone = CMUtility.readString(15);
System.out.print("邮箱:");
String email = CMUtility.readString(15);
Customer cust= new Customer(name,gender,age,phone,email);
boolean flage =customer.addCustomer(cust);
if(flage == true){
System.out.println("-----------------------添加成功-----------------------");
}else{
System.out.println("-----------------------添加失败-----------------------");
}
}
/**
*
* @Description 修改用户的方法
* @author Bofu
* @Date 2019年8月10日下午8:22:02
*/
private void modifyCustomer(){
//定义一个Customer的对象
Customer cust = null;
//定义并初始化索引的值
int index = 0;
System.out.println("-----------------------修改客户-----------------------");
for(;;){
System.out.print("请选择要修改的客户编号(-1为退出选择):");
index = CMUtility.readInt();
//退出并返回界面
if(index ==-1){
return;
}
//用getCustomer方法返回一个值,null则表示没有这个索引值。有则直接返回索引customers[index]并跳出循环
cust = customer.getCustomer(index-1);
if(cust == null){
System.out.println("客户不存在于列表中,请重新输入编号");
}else
break;
}
//符合要求后,对选中的编号进行修改
System.out.print("姓名("+cust.getName()+"):");
String name = CMUtility.readString(4, cust.getName());
System.out.print("性别("+cust.getGender()+"):");
char gender = CMUtility.readChar(cust.getGender());
System.out.print("年龄("+cust.getAge()+"):");
int age = CMUtility.readInt(cust.getAge());
System.out.print("号码("+cust.getPhone()+"):");
String phone = CMUtility.readString(15, cust.getPhone());
System.out.print("邮箱("+cust.getEmail()+"):");
String email = CMUtility.readString(15, cust.getEmail());
//将修改后的信息封装在cust这里
cust = new Customer(name, gender,age,phone,email);
//判断flage是否符合要求
boolean flage = customer.replaceCustomer(index-1, cust);
if(flage == false){
System.out.println("-----------------------修改客户失败-----------------------");
}else{
System.out.println("-----------------------修改客户成功-----------------------");
}
}
/**
*
* @Description 删除用户的方法
* @author Bofu
* @Date 2019年8月10日下午8:22:19
*/
private void deleteCustomer(){
//与上面修改方法类似
Customer cust = null;
int index = 0;
System.out.println("-----------------------删除客户-----------------------");
for(;;){
System.out.print("请选择你要删除的客户(-1请退出):");
index = CMUtility.readInt();
if(index == -1){
return;
}
cust = customer.getCustomer(index-1);
if(cust == null){
System.out.println("客户不存在,请重新输入。");
}
break;
}
System.out.print("是否确定删除(Y/N):");
char key = CMUtility.readConfirmSelection();
if(key == 'Y'){
boolean flage = customer.deleteCustomer(index-1);
if( flage == true){
System.out.println("-----------------------删除客户成功-----------------------");
}else{
System.out.println("-----------------------删除客户失败-----------------------");
}
}
}
/**
*
* @Description 用户列表查看方法
* @author Bofu
* @Date 2019年8月10日下午8:22:37
*/
private void listCustomer(){
System.out.println("-----------------------查询客户-----------------------");
//显示客户列表
Customer[] cust = customer.ListCustomer();
if(cust.length == 0){
System.out.println("没有客户信息。");
}else{
customer.showListTitle();
for(int i =0;i < cust.length;i++){
System.out.println((i+1)+"\t"+cust[i].getMessage());
}
}
System.out.println("-----------------------查询客户完成-----------------------");
}
/**
*
* @Description 用于调用enterMain方法
* @author Bofu
* @Date 2019年8月10日下午8:16:12
* @param args
*/
public static void main(String[] args) {
//定义一个CustomerView的对象,让其构造器中的初始化可以运行
CustomerView cView = new CustomerView();
cView.enterMain();
}
}
(以上,第一次写博客只是为了记录记录,如有不足的地方可以指出来讨论讨论,本人很乐意接受批评嘻嘻,大家一起努力加油吧!)