不进行GUI相关设计,不面向 swing开发,这个小案例目的是综合 ArrayList 以及对软件工程的设计思想,逻辑思考能力的训练。
前言
在软件工程中,常常需要把复杂的系统划分成小的组成部分, 把一个一个的功能拆分开来分别设计,使软件系统的职责得到合理划分,良好的设计可以降低系统各部分的相互依赖(解耦),提高组成单元的内聚性,从而可以达到提高系统的维护性和扩展性。
声明:本案例仅仅是采用最基本的ArrayList 集合实现,具体很多细节和其他高级的东西并未涉及!仅供参考!
学员管理系统设计
目标:学生管理系统实现
需求:
1.添加学生:通过键盘录入学生信息,添加到集合中
2.删除学生:通过键盘录入要删除学生的学号,将该学生对象从集合中删除。
3.修改学生:通过键盘录入要修改学生的学号,将该学生对象其他信息进行修改
3.查看学生:将集合中所以学生对象信息打印
功能就是这么简单易了~~
定义学生类
这个就是最简单的类和构造方法定义了。
/**
目标:学生类的设计,用于创建学生对象,封装学的对象需要的数据。
*/
public class Student {
// 成员变量封装属性信息的。
private String sid; // 学生id
private String name; // 学生姓名
private String age; // 学生年龄
private String address; // 学生所在地
public Student() {
}
public Student(String sid, String name, String age, String address) {
this.sid = sid;
this.name = name;
this.age = age;
this.address = address;
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
主界面设计
public class StudentManagement {
// 学生管理系统主界面的架构搭建
public static void main(String[] args) {
// 创建一个集合容器存储学生对象
ArrayList<Student> students = new ArrayList<>();
// 欢迎界面的设计
System.out.println("欢迎进入学生管理系统!");
System.out.println("添加学生操作 add ");
System.out.println("删除学生操作 delete ");
System.out.println("修改学生操作 alter ");
System.out.println("查看学生操作query ");
System.out.println("退出系统exit ");
Scanner sc = new Scanner(System.in);
while (true) {
// 定义死循环让系统一直运行着直到用户输入exit为止
System.out.println("请输入您要进行的操作:");
String operation = sc.nextLine();
switch (operation) {
case "add":
// 添加学生信息
addStudent(students);
break;
case "delete":
// 删除学生信息
deleteStudent(students);
break;
case "alter":
// 修改学生信息
alterStudent(students);
break;
case "query":
// 查询学生信息
queryStudent(students);
break;
case "exit":
System.out.println("退出系统完成,欢迎下次光临!");
System.exit(0); // 终止当前运行的Java虚拟机
break;
default:
System.out.println("您输入的操作命令有误,请重新确认!");
}
}
}
这个是主界面设计,大致思路就是通过控制台提示输入相应的操作,因为是单指匹配所以采用 switch 分支结构,对应的操作下面封装着对应的方法,可以达到拆分功能,有效解耦的目的,便于以后维护。(死循环目的是不会让用户输入一次就完事了,执行完输入的对应操作会一直进行下去除非输入退出操作)
好了接下来就是各个功能的具体实现了,具体实现就是一些逻辑。
添加功能
private static void addStudent(ArrayList<Student> students) {
Scanner sc = new Scanner(System.in);
// 添加之前先判断集合中是否已存在该元素
String idTemp; // 因为后面添加要用到学号所以在外面定义好
while(true) {
System.out.println("请输入要添加学生的学号:");
idTemp = sc.nextLine();
// for (Student student : students) {
// if (student.getSid().equals(idTemp)) {
// break;
// } // 不太好,最好封装成一个方法
if (!isSidRepeat(students, idTemp)) break;
System.out.println("您输入的学号已经存在,请重新输入!");
}
// 已经判断完容器中没有该学号后,开始进行添加操作
System.out.println("请输入添加学生的名称:");
String name = sc.nextLine();
System.out.println("请输入添加学生的年龄:");
String age = sc.nextLine();
System.out.println("请输入添加学生的地址:");
String address = sc.nextLine();
students.add(new Student(idTemp, name, age, address));
System.out.println("恭喜您,添加学生数据成功!");
}
注意: 这里将查看集合中是否存在对应学生对象学号封装成一个方法的原因是之后会有很多个功能都要增加这个判定,害面向对象的特性你懂的,就像你平常用的 API一样,隐藏细节增强复用性嘛。
下面功能基本就是简单的逻辑问题,不再一一解释流程了。跟着代码走一遍应该没啥问题~
public static boolean isSidRepeat(ArrayList<Student> students, String sid) {
for (Student student : students) {
if (student.getSid().equals(sid)) {
return true;
}
}
return false;
}
查看内容
private static void queryStudent(ArrayList<Student> students) {
System.out.println("---------查询学生信息----------");
// 先判断集合大小是否为0
if (students.size() == 0) {
System.out.println("还没有添加学生对象进来,请先执行添加操作!");
} else {
// 输出格式格式化
System.out.println("学号\t名称\t年龄\t地址\t");
for (Student student : students) {
System.out.println(student.getSid() + "\t\t" + student.getName() + "\t\t" + student.getAge() + "\t\t" + student.getAddress());
}
}
}
删除内容
private static void deleteStudent(ArrayList<Student> students) {
if (students.size() == 0) {
System.out.println("根本没有学生对象可删除!");
// return; 可以直接终止方法
return;
}
String sid;
Scanner sc = new Scanner(System.in);
// 定义一个死循环让用户一直输入直到一个已经存在的学号为止
while (true) {
System.out.println("请输入要删除学生的学号:");
sid = sc.nextLine();
if (isSidRepeat(students, sid)) {
break; //有重复的就结束死循环,因为已经找到了存在的学号的学生,不用再找!
} else {
System.out.println("对不起,不存在该学号的学生,无法删除");
}
}
for (Student student : students) {
if (student.getSid().equals(sid)) {
students.remove(student);
System.out.println("删除后的结果展示:");
queryStudent(students);
System.out.println("恭喜您,您已经删除成功" + student.getName() + "同学的信息!");
break; // 不用再循环下去!
}
}
}
修改内容
private static void alterStudent(ArrayList<Student> students) {
if (students.size() == 0) {
System.out.println("根本没有元素可修改!");
return;
}
String sid;
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请您输入您要修改的学生对象的学号:");
sid = sc.nextLine();
if (isSidRepeat(students, sid)) {
break;
} else {
System.out.println("对不起,不存在该学号的学生!");
}
}
for (Student student : students) {
if (student.getSid().equals(sid)) {
System.out.print("请您输入修改学生的名称:");
String name = sc.nextLine();
System.out.print("请您输入修改学生的年龄:");
String age = sc.nextLine();
System.out.print("请您输入修改学生的地址:");
String address = sc.nextLine();
student.setName(name);
student.setAge(age);
student.setAddress(address);
break;
}
}
System.out.println("修改学生信息完成!!");
}
好的能看到这里你已经执行完上面的循环啦,可以退出啦,学习可不就是死循环嘛!