目录

​1,案例驱动模式​

​1.1:案例驱动模式概述​

​1.2:案例驱动模式的好处​

​2,分类思想​

​2.1:分类思想概述​

​2.2:信息管理系统​

​3,分包思想​

​3.1:分包思想概述​

​3.2:包的概述​

​3.3:包的注意事项​

​3.4:类与类之间的访问​

​4,信息管理系统​

​4.1:系统介绍​

​4.2:学生管理系统(应用)​

​4.2.1:需求说明​

​4.2.2:实现步骤​

​4.2.3:代码实现​


1,案例驱动模式

1.1:案例驱动模式概述

通过我们已掌握的知识点,先实现一个案例,然后找出这个案例中,存在的一些问题,在通过新知识点解决问题

1.2:案例驱动模式的好处

  • 解决重复代码过多的冗余,提高代码的复用性
  • 解决业务逻辑聚集紧密导致的可读性差,提高代码的可读性
  • 解决代码可维护性差,提高代码的维护性

2,分类思想

2.1:分类思想概述

分工协作,专人干专事

2.2:信息管理系统

  • Student类 标准学生类,封装键盘录入的学生信息(id , name , age , birthday)
  • StudentDao类 Dao : (Data Access Object 缩写) 用于访问存储数据的数组或集合
  • StudentService类 用来进行业务逻辑的处理(例如: 判断录入的id是否存在)
  • StudentController类 和用户打交道(接收用户需求,采集用户信息,打印数据到控制台)

Java知识【案件驱动模式&分类分包思想】_数组

 

 

3,分包思想

3.1:分包思想概述

如果将所有的类文件都放在同一个包下,不利于管理和后期维护,所以,对于不同功能的类文件,可以放在不同的包下进行管理

3.2:包的概述


  • 本质上就是文件夹
  • 创建包
    多级包之间使用 " . " 进行分割 多级包的定义规范:公司的网站地址翻转(去掉www) 比如:传智程序员的网站址为​​www.czxy.com​​ 后期我们所定义的包的结构就是:com.czxy.其他的包名
  • 包的命名规则
    字母都是小写

3.3:包的注意事项

  • package语句必须是程序的第一条可执行的代码
  • package语句在一个java文件中只能有一个
  • 如果没有package,默认表示无包名

3.4:类与类之间的访问

  • 同一个包下的访问
    不需要导包,直接使用即可
  • 不同包下的访问
    1.import 导包后访问
    2.通过全类名(包名 + 类名)访问
  • 注意:import 、package 、class 三个关键字的摆放位置存在顺序关系
    package 必须是程序的第一条可执行的代码
    import 需要写在 package 下面
    class 需要在 import 下面

4,信息管理系统

4.1:系统介绍

Java知识【案件驱动模式&分类分包思想】_键盘录入_02

4.2:学生管理系统(应用)

4.2.1:需求说明

  • 添加学生: 键盘录入学生信息(id,name,age,birthday)
    使用数组存储学生信息,要求学生的id不能重复
  • 删除学生: 键盘录入要删除学生的id值,将该学生从数组中移除,如果录入的id在数组中不存在,需要重新录入
  • 修改学生: 键盘录入要修改学生的id值和修改后的学生信息
    将数组中该学生的信息修改,如果录入的id在数组中不存在,需要重新录入
  • 查询学生: 将数组中存储的所有学生的信息输出到控制台

4.2.2:实现步骤

环境搭建实现步骤


存储的类

作用

com.czxy.edu.info.manager.domain

Student.java

封装学生信息

com.czxy.edu.info.manager.dao

StudentDao.java

访问存储数据的数组,进行赠删改查(库管)

com.czxy.edu.info.manager.service

StudentService.java

业务的逻辑处理(业务员)

com.czxy.edu.info.manager.controller

StudentController.java

和用户打交道(客服接待)

com.czxy.edu.info.manager.entry

InfoManagerEntry.java

程序的入口类,提供一个main方法

  • 菜单搭建实现步骤
  • 需求
  • 管理系统菜单搭建
  • 学生管理系统菜单搭建
  • 实现步骤
  1. 展示欢迎页面,用输出语句完成主界面的编写
  2. 获取用户的选择,用Scanner实现键盘录入数据
  3. 根据用户的选择执行对应的操作,用switch语句完成操作的选择

添加功能实现步骤

Java知识【案件驱动模式&分类分包思想】_学生管理系统_03

 添加功能优化:判断id是否存在

Java知识【案件驱动模式&分类分包思想】_java_04

 查询功能实现步骤 

Java知识【案件驱动模式&分类分包思想】_键盘录入_05

删除功能实现步骤

Java知识【案件驱动模式&分类分包思想】_学生管理系统_06

修改功能实现步骤

Java知识【案件驱动模式&分类分包思想】_学生管理系统_07

 

  • 系统优化
  • 把updateStudent和deleteStudentById中录入学生id代码抽取到一个方法(inputStudentId)中 该方法的主要作用就是录入学生的id,方法的返回值为String类型
  • 把addStudent和updateStudent中录入学生信息的代码抽取到一个方法(inputStudentInfo)中 该方法的主要作用就是录入学生的信息,并封装为学生对象,方法的返回值为Student类型

4.2.3:代码实现

学生类

public class Student {
private String id;
private String name;
private String age;
private String birthday;
String address;

public Student() {
}

public Student(String id, String name, String age, String birthday) {
this.id = id;
this.name = name;
this.age = age;
this.birthday = birthday;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

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 getBirthday() {
return birthday;
}

public void setBirthday(String birthday) {
this.birthday = birthday;
}

}

程序入口InfoManagerEntry类  

public class InfoManagerEntry {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
// 主菜单搭建
System.out.println("--------欢迎来到信息管理系统--------");
System.out.println("请输入您的选择: 1.学生管理 2.老师管理 3.退出");
String choice = sc.next();
switch (choice) {
case "1":
// System.out.println("学生管理");
// 开启学生管理系统
StudentController studentController = new StudentController();
studentController.start();
break;
case "2":
System.out.println("老师管理");
TeacherController teacherController = new TeacherController();
teacherController.start();
break;
case "3":
System.out.println("感谢您的使用");
// 退出当前正在运行的JVM虚拟机
System.exit(0);
break;
default:
System.out.println("您的输入有误, 请重新输入");
break;
}
}
}
}

StudentController类  

public class StudentController {
// 业务员对象
private StudentService studentService = new StudentService();

private Scanner sc = new Scanner(System.in);

// 开启学生管理系统, 并展示学生管理系统菜单
public void start() {
//Scanner sc = new Scanner(System.in);
studentLoop:
while (true) {
System.out.println("--------欢迎来到 <学生> 管理系统--------");
System.out.println("请输入您的选择: 1.添加学生 2.删除学生 3.修改学生 4.查看学生 5.退出");
String choice = sc.next();
switch (choice) {
case "1":
// System.out.println("添加");
addStudent();
break;
case "2":
// System.out.println("删除");
deleteStudentById();
break;
case "3":
// System.out.println("修改");
updateStudent();
break;
case "4":
// System.out.println("查询");
findAllStudent();
break;
case "5":
System.out.println("感谢您使用学生管理系统, 再见!");
break studentLoop;
default:
System.out.println("您的输入有误, 请重新输入");
break;
}
}
}

// 修改学生方法
public void updateStudent() {
String updateId = inputStudentId();
Student newStu = inputStudentInfo(updateId);
studentService.updateStudent(updateId, newStu);

System.out.println("修改成功!");
}

// 删除学生方法
public void deleteStudentById() {
String delId = inputStudentId();
// 3. 调用业务员中的deleteStudentById根据id, 删除学生
studentService.deleteStudentById(delId);
// 4. 提示删除成功
System.out.println("删除成功!");
}

// 查看学生方法
public void findAllStudent() {
// 1. 调用业务员中的获取方法, 得到学生的对象数组
Student[] stus = studentService.findAllStudent();
// 2. 判断数组的内存地址, 是否为null
if (stus == null) {
System.out.println("查无信息, 请添加后重试");
return;
}
// 3. 遍历数组, 获取学生信息并打印在控制台
System.out.println("学号\t\t姓名\t年龄\t生日");
for (int i = 0; i < stus.length; i++) {
Student stu = stus[i];
if (stu != null) {
System.out.println(stu.getId() + "\t" + stu.getName() + "\t" + stu.getAge() + "\t\t" + stu.getBirthday());
}
}
}

// 添加学生方法
public void addStudent() {
// StudentService studentService = new StudentService();
// 1. 键盘接收学生信息
String id;
while (true) {
System.out.println("请输入学生id:");
id = sc.next();
boolean flag = studentService.isExists(id);
if (flag) {
System.out.println("学号已被占用, 请重新输入");
} else {
break;
}
}

Student stu = inputStudentInfo(id);

// 3. 将学生对象,传递给StudentService(业务员)中的addStudent方法
boolean result = studentService.addStudent(stu);
// 4. 根据返回的boolean类型结果, 在控制台打印成功\失败
if (result) {
System.out.println("添加成功");
} else {
System.out.println("添加失败");
}
}

// 键盘录入学生id
public String inputStudentId() {
String id;
while (true) {
System.out.println("请输入学生id:");
id = sc.next();
boolean exists = studentService.isExists(id);
if (!exists) {
System.out.println("您输入的id不存在, 请重新输入:");
} else {
break;
}
}
return id;
}

// 键盘录入学生信息
public Student inputStudentInfo(String id) {
System.out.println("请输入学生姓名:");
String name = sc.next();
System.out.println("请输入学生年龄:");
String age = sc.next();
System.out.println("请输入学生生日:");
String birthday = sc.next();
Student stu = new Student();
stu.setId(id);
stu.setName(name);
stu.setAge(age);
stu.setBirthday(birthday);
return stu;
}
}

 StudentService类

public class StudentService {
// 创建StudentDao (库管)
private StudentDao studentDao = new StudentDao();
// 添加学生方法
public boolean addStudent(Student stu) {
// 2. 将学生对象, 传递给StudentDao 库管中的addStudent方法
// 3. 将返回的boolean类型结果, 返还给StudentController
return studentDao.addStudent(stu);
}
// 判断学号是否存在方法
public boolean isExists(String id) {
Student[] stus = studentDao.findAllStudent();
// 假设id在数组中不存在
boolean exists = false;
// 遍历数组, 获取每一个学生对象, 准备进行判断
for (int i = 0; i < stus.length; i++) {
Student student = stus[i];
if(student != null && student.getId().equals(id)){
exists = true;
break;
}
}

return exists;
}
// 查看学生方法
public Student[] findAllStudent() {
// 1. 调用库管对象的findAllStudent获取学生对象数组
Student[] allStudent = studentDao.findAllStudent();
// 2. 判断数组中是否有学生信息 (有: 返回地址, 没有: 返回null)
// 思路: 数组中只要存在一个不是null的元素, 那就代表有学生信息
boolean flag = false;
for (int i = 0; i < allStudent.length; i++) {
Student stu = allStudent[i];
if(stu != null){
flag = true;
break;
}
}

if(flag){
// 有信息
return allStudent;
}else{
// 没有信息
return null;
}

}

public void deleteStudentById(String delId) {
studentDao.deleteStudentById(delId);
}

public void updateStudent(String updateId, Student newStu) {
studentDao.updateStudent(updateId, newStu);
}
}

StudentDao类  

public class StudentDao {
// 创建学生对象数组
private static Student[] stus = new Student[5];
// 添加学生方法
public boolean addStudent(Student stu) {

// 2. 添加学生到数组
//2.1 定义变量index为-1,假设数组已经全部存满,没有null的元素
int index = -1;
//2.2 遍历数组取出每一个元素,判断是否是null
for (int i = 0; i < stus.length; i++) {
Student student = stus[i];
if(student == null){
index = i;
//2.3 如果为null,让index变量记录当前索引位置,并使用break结束循环遍历
break;
}
}

// 3. 返回是否添加成功的boolean类型状态
if(index == -1){
// 装满了
return false;
}else{
// 没有装满, 正常添加, 返回true
stus[index] = stu;
return true;
}
}
// 查看学生方法
public Student[] findAllStudent() {
return stus;
}

public void deleteStudentById(String delId) {
// 1. 查找id在容器中所在的索引位置
int index = getIndex(delId);
// 2. 将该索引位置,使用null元素进行覆盖
stus[index] = null;
}

public int getIndex(String id){
int index = -1;
for (int i = 0; i < stus.length; i++) {
Student stu = stus[i];
if(stu != null && stu.getId().equals(id)){
index = i;
break;
}
}
return index;
}

public void updateStudent(String updateId, Student newStu) {
// 1. 查找updateId, 在容器中的索引位置
int index = getIndex(updateId);
// 2. 将该索引位置, 使用新的学生对象替换
stus[index] = newStu;
}
}