前言
这是狗子我学习过一遍 Java基础 之后复习找到的 第二个练手案例,且两个项目都来自于 小破站 中尚硅谷的练手案例,我在写这两个项目的时候除了 尚硅谷 中提及到的部分也添加了一些自己的想法在里面,因此可能会有一些许不同,还请见谅。如果阅读过程中出现什么问题,欢迎评论留言。
第一个练手案例为 基于Java基础的家庭收支记账软件,大家伙有兴趣的话可以去瞄两眼 ᵎ(•̀㉨•́)و)
同时贴上尚硅谷Java基础教学视频的链接 – > 传送门
一、前期准备
在开始搞事情之前得先准备好下面这些东西,其中 JDK 和 IDE 不一定需要统一,这只是狗子我使用的版本而已。准备好之后带上我们的脑子就可以开搞啦
- 编程语言 : Java
- 运行环境 : JDK1.8
- IDE : IDEA 2020
- 储备知识 : Java基础
二、整体结构介绍
在这次案例中第一次使用到了 MVC框架,将业务层和视图层进行分离,提高了程序的可维护性,降低了耦合性,这一框架模式也是从尚硅谷的教学中学习得来,‘真’ YYDS
三、工具类介绍
在尚硅谷的文件中提供了已经封装好的 CMUtility 工具类,方便我们实现键盘的访问。而由于狗子我是在复习,工具类中涉及到的基本上都已经接触过,因此这个工具类便自己进行了编写,如果是从视频那边过来的话也可以直接跳过工具类的编写,不过还是推荐自己尝试一下,我写的工具类名为 CustomerUtility
函数名 | 功能介绍 | 返回类型 |
---|---|---|
readMenuSelection | 用于界面菜单的选择 | int |
readChar | 从键盘中读取一个字符且存在方法重载 | char |
readInt | 从键盘中读取一个不超过二位数的整数且存在方法重载 | int |
readString | 从键盘中读取一个长度不超过 limit 的字符串且存在方法重载 | String |
readConfirmSelection | 用于确认选择的输入,读取‘Y’或‘N’ | char |
readKeyBoard | 用于记录用户从键盘中输入的数据 | String |
在这里附上一小撮演示小截图
四、功能浅谈
1、Customer 类
顾名思义(第一次看的时候还去翻译了),这是一个用来封装客户信息的类,这里面封装了客户的基本信息,并提供了各属性的 get / set
方法以及自编的构造器对属性进行初始化,下方代码省略了 get / set
方法
public class 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;
}
//构造器重载
public Customer(String name, char gender, int age) {
this(name, gender, age, "null", "null");
}
}
2、CustomerView 类
主函数所在的类,其为主模块,负责菜单的显示和处理用户操作,其中该类下的成员方法仅供 enterMainMenu()
方法调用,该类中实现的主要有以下函数:
2.1、 public void enterMainMenu()
用于显示主菜单,相应用户输入,根据用户操作分别调用其他相应的成员方法,从而完成客户信息处理
public void enterMainMenu() {
boolean loopFlag = true;
do {
System.out.println("\n-----------------客户信息管理系统-----------------\n");
System.out.println("\t\t1. 添 加 客 户\t\t\t2. 修 改 客 户");
System.out.println("\t\t3. 删 除 客 户\t\t\t4. 客 户 列 表");
System.out.println("\t\t5. 退 出");
System.out.print("\t\t请选择(1-5):");
int selection = CustomerUtility.readMenuSelection(5);
switch(selection) {
case 1: {
addNewCustomer(); //添加客户信息
break;
}
case 2: {
modifyCustomer(); //修改客户信息
break;
}
case 3: {
deleteCustomer(); //删除客户信息
break;
}
case 4: {
listAllCustomers(); //遍历客户列表
break;
}
case 5: {
System.out.print("确认是否退出(Y / N): ");
if(CustomerUtility.readConfirmSelection() == 'Y') {
loopFlag = false;
}
break;
}
}
}while(loopFlag);
}
2.2、private void addNewCustomer()
用于添加新用户,且只允许 enterMainMenu 方法调用
private void addNewCustomer() {
Customer customer = new Customer();
System.out.println("---------------------添加客户---------------------");
System.out.print("姓名:");
customer.setName(CustomerUtility.readString(4));
System.out.print("性别:");
customer.setGender(CustomerUtility.readChar());
System.out.print("年龄:");
customer.setAge(CustomerUtility.readInt());
System.out.print("电话:");
customer.setPhone(CustomerUtility.readString(15));
System.out.print("邮箱:");
customer.setEmail(CustomerUtility.readString(20));
if(customerList.addCustomer(customer)) {
System.out.println("---------------------添加完成---------------------");
} else {
System.out.println("----------------记录已满,无法添加-----------------");
}
}
2.3、 private void modifyCustomer()
实例化一个新的客户对象传递给 replaceCustomer 方法从而达到修改客户信息的作用
private void modifyCustomer(){
System.out.println("---------------------修改客户---------------------");
int index;
Customer customer = null;
while(true) {
System.out.print("请选择待修改客户姓名(0退出):");
String name = CustomerUtility.readString(4);
if(name.equals("0")) {
return;
}
index = customerList.searchCustomer(name);
if(index == -1) {
System.out.println("该客户不存在!");
continue;
}
customer = customerList.getCustomer(index+1);
if(customer == null) {
System.out.println("该客户不存在!");
} else {
break;
}
}
System.out.print("姓名(" + customer.getName() + "): ");
String name = CustomerUtility.readString(4, customer.getName());
System.out.print("性别(" + customer.getGender() + "): ");
char gender = CustomerUtility.readChar(customer.getGender());
System.out.print("年龄(" + customer.getAge() + "): ");
int age = CustomerUtility.readInt(customer.getAge());
System.out.print("电话(" + customer.getPhone() + "): ");
String phone = CustomerUtility.readString(15, customer.getPhone());
System.out.print("邮箱(" + customer.getEmail() + "): ");
String email = CustomerUtility.readString(20, customer.getEmail());
if(customerList.replaceCustomer(index+1, new Customer(name, gender, age, phone, email))) {
System.out.println("---------------------修改完成---------------------");
} else {
System.out.println("----------无法找到指定客户,修改失败--------------");
}
}
2.4、 private void deleteCustomer()
通过用户输入的下标 index 进行索引客户对象信息,从而对其进行删除
private void deleteCustomer() {
System.out.println("---------------------删除客户---------------------");
int index = 0;
while(true) {
System.out.print("请选择待删除客户编号(0退出):");
index = CustomerUtility.readInt();
if(index == 0) {
return;
}
if(customerList.getCustomer(index) == null) {
System.out.println("无法找到该用户!");
} else {
break;
}
}
System.out.print("确认是否删除(Y / N):");
if(CustomerUtility.readConfirmSelection() == 'N') {
return;
}
if(customerList.deleteCustomer(index)) {
System.out.println("---------------------删除完成---------------------");
} else {
System.out.println("----------无法找到指定客户,删除失败--------------");
}
}
2.5、 private void listAllCustomers()
通过getCustomers()
方法获得客户对象列表后遍历已添加的客户信息
private void listAllCustomers() {
System.out.println("---------------------------客户列表---------------------------");
Customer[] customers = customerList.getCustomers(); //接收客户对象数组
if(customers.length == 0) {
System.out.println("没有客户记录!");
} else {
System.out.println("序号\t\t姓名\t\t性别\t\t年龄\t\t电话\t\t\t\t\t邮箱");
for (int i = 0; i < customers.length; i++) {
System.out.println("No." + (i+1) + "\t" + customers[i].getName() + "\t\t" + customers[i].getGender() + "\t\t" + customers[i].getAge() + "\t\t" + customers[i].getPhone() + "\t\t" + customers[i].getEmail());
}
}
System.out.println("----------------------------------------------------------");
}
3、CustomerList 类
该类为 Customer对象 的管理模块,内部使用 数组 管理一组Customer对象。在本类中封装了实际用户个数属性 total
和存放客户对象的数组 customers
,默认可存放十个客户对象信息,可通过构造器进行自定义修改,以及具备对列表进行管理操作功能的方法:
3.1、 public boolean addCustomer(Customer customer)
将新的客户对象 customer
通过尾插法添加到客户对象数组中
public boolean addCustomer(Customer customer) {
if(customers.length <= this.total) {
return false;
}
customers[this.total++] = customer;
return true;
}
3.2、 public boolean replaceCustomer(int index, Customer customer)
用修改过的客户对象 customer
替换数组中由 index
指定的对象,其中 index 为用户指定伤处对像在数组中的索引位置,用户输入从 1 开始
public boolean replaceCustomer(int index, Customer customer) {
if(--index < 0 || index > this.total) {
return false;
}
customers[index] = customer;
return true;
}
3.3、 public int searchCustomer(String name)
通过名字检索指定客户对象,这一方法为狗子我自己添加的,尚硅谷视频中使用的是 下标检索
public int searchCustomer(String name) {
if(this.total == 0) {
return -1;
}
for (int i = 0; i < this.total; i++) {
if(customers[i].getName().equals(name)) {
return i;
}
}
return -1;
}
**3.4、public boolean deleteCustomer(int index) **
从数组中删除指定索引位置 index 的客户对象信息,其中为用户指定伤处对像在数组中的索引位置,用户输入从 1 开始
public boolean deleteCustomer(int index) {
if(--index < 0 || index > this.total) {
return false;
}
for (int i = index; i < total-1; i++) {
customers[i] = customers[i+1];
}
customers[--this.total] = null;
return true;
}
3.5、 public Customer[] getCustomers()
获取数组中记录的所有客户对象
public Customer[] getCustomers() {
Customer[] customersList = new Customer[this.total];
for (int i = 0; i < this.total; i++) {
customersList[i] = customers[i];
}
return customersList;
}
3.6、 public Customer getCustomer(int index)
返回指定索引位置 index 的客户对象信息,其中 index 为用户指定伤处对像在数组中的索引位置,用户输入从 1 开始
public Customer getCustomer(int index) {
if(--index < 0 || index > this.total) {
return null;
}
return customers[index];
}
五、收获
每次复习一部分知识之后都会有一定的新的收获,补充了很多细节,最重要的莫过于是在 Java 中最重要的面向对象的思想(此对象非你对象(๑•̌㉨•̑๑)੭ु⁾⁾ ༘ؓ ँั๊ྃ)
- 第一次接触到了 MVC框架 ,让自己的程序更加结构化,找到一个自己想要的函数真的很好找,改 bug 的时间缩短了
- 对封装还是有了进一步的认识,函数的重用适当的变多,增加了程序的可维护性
六、总结
还是那句话:掉头发这件事情你得实践了才知道你掉的质量怎么样,在学习Java甚至是任何一门语言中,只学不敲,头发也就白掉了。这次相对于第一次的练手案例在结构上更加合理,动手真的是学习道路上必不可缺的一部分。
这里附上该案例中的全部代码 – >传送门