把之前的學生管理系統,改造成三層架構的形式
三層架構即:
視圖層,通常用于與用戶互動,收集用戶輸入的資訊,展示資訊
業務層,通常做業務邏輯處理
持久層,通常只做與資料增刪改查相關的操作
對應的包結構就是
視圖層 controller
業務層 service
持久層 dao
外加 domain 存放模型類、entry 程式入口、utils 工具類
先來entry寫程式入口
順便把這個管理系統升級成攜帶老師管理的資訊管理系統
以學生管理系統為例,主要介紹,老師管理系統同學生管理系統一樣實作
因為controller是用于與用戶互動的
所以main方法呼叫StudentController物件的start方法,進入學生管理系統部分
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("老師管理");
new TeacherController().start();
break;
case "3":
System.out.println("感謝您的使用");
System.exit(0); // 退出當前運行的JVM虛擬機
break;
default:
System.out.println("您的輸入有誤 請重新輸入");
break;
}
}
}
}
在domain中創建Student類
包含幾個簡單欄位,并帶有get/set方法,以及無參和有參構造方法
public class Student {
private String id; // 學號
private String name; // 姓名
private int age; // 年齡
private String birthday; // 生日
public Student() {
}
public Student(String id, String name, int 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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
}
在StudentController中 撰寫方法start()實作學生管理系統的主界面輸出
public void start() {
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("洗掉學生");
deleteStudent();
break;
case "3":
//System.out.println("修改學生");
updateStudent();
break;
case "4":
//System.out.println("查看學生");
showStudent();
break;
case "5":
System.out.println("感謝您的使用");
return;
default:
System.out.println("您的輸入有誤");
break;
}
}
}
分別撰寫各個功能呼叫的具體方法
添加學生功能
private void addStudent() {
// 接受用戶輸入資訊
String id;
while (true) {
System.out.println("請輸入學號:");
id = sc.next();
int i = studentService.findStudentIndexById(id);
if (i != -1) {
System.out.println("學號已被占用 請重新輸入");
} else {
break;
}
}
Student stu = inputStudentInfo(id);
// 傳遞給業務層
boolean result = studentService.addStudent(stu);
// 控制臺列印添加成功/添加失敗
if (result) {
System.out.println("添加成功");
} else {
System.out.println("添加失敗");
}
}
此處與之前版本的管理系統不同的是視圖層把具體的操作資料的任務交給業務層,讓業務層去找持久層完成資料的添加功能
視圖層只負責把用戶的輸入提交給業務層,并把業務層的回傳的結果輸出給用戶,完成與用戶的互動
業務層物件StudentService studentService = new StudentService(); 在StudentController的成員變數中宣告
學生資訊的添加功能需要先呼叫業務層的findStudentIndexById方法查找用戶輸入的學號是否已存在,該方法當存在用戶輸入的學號時,回傳該條記錄的索引,不存在則回傳-1,因此可以用其判斷學號是否被占用
在業務層中實作findStudentIndexById方法,呼叫持久層的getIndex方法查詢索引并回傳結果,目前的業務層負責的業務僅僅是傳遞資訊
public int findStudentIndexById(String id) {
return studentDao.getIndex(id);
}
在持久層使用ArrayList型別的成員變數“list”存盤物件,因此getIndex方法如下
public int getIndex(String id) {
int index = -1;
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getId().equals(id)) {
index = i;
break;
}
}
return index;
}
資料逐層return到Controller,便可以回傳值判斷是否繼續添加輸入資訊
當用戶輸入一個未被占用的學號時,StudentController的addStudent方法繼續執行,為了方便,我把用戶輸入的資料封裝Student物件的部分提取成一個方法inputStudentInfo
private 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();
return new Student(id, name, age, birthday);
}
之后StudentController的addStudent方法會呼叫StudentService的addStudent傳遞Student實體給業務層,讓業務層完成添加作業,并回傳一個boolean型別結果表示是否添加成功
在業務層的addStudent方法中,呼叫持久層的addStudent方法,完成資料添加
public boolean addStudent(Student stu) {
// 傳遞給持久層 回傳結果給視圖層
return studentDao.addStudent(stu);
}
持久層則直接呼叫ArrayList的add方法向“list”物件中添加Student物件
public boolean addStudent(Student stu) {
return list.add(stu);
}
至此,添加學生的功能就實作完成了
查看學生功能
對視圖層來說,查看學生功能需要從業務層獲取到所有學生的集合,然后遍歷集合逐一列印到控制臺,并且當集合為空的時候,給用戶列印額外的提示資訊
private void showStudent() {
// 從業務層獲取所有學生的集合
ArrayList<Student> students = studentService.findAllStudent();
if (students.size() == 0) {
System.out.println("查無資訊 請添加后重試");
return;
}
// 列印表頭
System.out.println("學號 姓名 年齡 生日");
// 遍歷集合并列印元素
for (Student stu : students) {
System.out.println(stu.getId() + " "
+ stu.getName() + " "
+ stu.getAge() + " "
+ stu.getBirthday());
}
}
業務層找持久層要集合物件,即:在業務層的findAllStudent方法中呼叫持久層的findAllStudent方法獲取集合物件
public ArrayList<Student> findAllStudent() {
return studentDao.findAllStudent();
}
在持久層中,直接回傳集合物件
public ArrayList<Student> findAllStudent() {
return list;
}
逐層回傳資料到視圖層,視圖層便可向用戶列印輸出
至此,查看學生的功能就實作完成了
洗掉學生功能
對視圖層來說,洗掉學生需要判斷用戶輸入的學號是否存在,若存在則洗掉,不存在則提示用戶
其中判斷用戶輸入的學號是否存在的邏輯,基本同添加學生功能的判斷用戶輸入的學號是否存在的邏輯一致,呼叫的都是同一個方法獲取索引,然后再根據索引判斷,不同的只是判斷的條件不一致,接下來具體分享一下呼叫的業務層的deleteStudent方法
private void deleteStudent() {
System.out.println("請輸入學號");
String id = sc.next();
int index = studentService.findStudentIndexById(id);
if (index == -1) {
System.out.println("學號" + id + " 不正確 請重新輸入");
} else {
studentService.deleteStudent(id);
System.out.println("洗掉成功");
}
}
洗掉的業務同樣是交由業務層處理,所以呼叫業務層的deleteStudent方法,
該方法呼叫持久層的deleteStudentById方法根據id洗掉元素,剩下操作資料的任務交給持久層完成,
public void deleteStudent(String id) {
studentDao.deleteStudentById(id);
}
在持久層中,呼叫getIndex方法獲取到要洗掉的物件的索引,根據索引直接在集合中remove元素,
public void deleteStudentById(String id) {
int index = getIndex(id);
list.remove(index);
}
至此,洗掉功能實作完成,
更新學生功能
更新功能和上述的添加和洗掉功能相似度很高,就不詳細寫了,
小結
三層就是,視圖層處理用戶互動,即輸入輸出操作,之后把作業交給業務層完成,之后業務層把操作資料的具體作業交給持久層完成,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/164753.html
標籤:Java
上一篇:springcloud 微服務分布式 flowable 作業流 前后分離 集成代碼生成器 shiro權限
下一篇:Java 繼承學習總結
